将字符串转换为控制器方法调用

问题描述:

我试图在我的应用程序控制器中创建通用面包屑方法,以基于当前控制器分配面包屑。如果我想为“东西”的指数的面包屑,我需要在视图中:将字符串转换为控制器方法调用

<%= breadcrumb :things, things %> 

而对于编辑或显示:

<%= breadcrumb :thing, thing %> 

如果事情是在东西控制器的方法是返回所有的事情,就是返回相关thing.Both的方法暴露,并且我在我的应用程序布局:

<%= breadcrumb crumb, crumb_resource %> 

而且在我的应用程序控制器:

def crumb 
    return controller_name.singularize.to_sym if edit_or_show_action 
    controller_name.to_sym 
end 

def crumb_resource 
    resource = controller_name 
    resource = controller_name.singularize if edit_or_show_action 
end 

def edit_or_show_action 
    action_name == 'edit' || 'show' 
end 

这显然会为crumb_resource返回一个字符串,而不是对控制器方法的调用。从我能找到的东西我相信它与发送有关,但

controller.send(resource) 

显然不起作用。如何将返回的字符串转换为控制器方法调用?

+0

您需要调用控制器方法的原因是什么?在大多数情况下,控制器方法会生成视图,或者是可以从视图访问的辅助方法。通常你不应该从另一个控制器中调用一个控制器。那么为什么你需要'controller.send(resource)'? – Casper

+0

因为我不知道另一种方式将资源字符串转换成我正在寻找的对象如果你正在访问视图中的对象,我认为最好通过控制器调用完成,但是我不'我不想单独硬编码每一个,这就是为什么我试图将'资源'字符串转换为视图调用的控制器方法。如果我接近它错误或有更好的方法,请让我知道。 – Mark

+0

你可能做错了什么,但可能不会。我认为你需要用你期望的具体例子来编辑你的答案。现在我们只是在这里谈论抽象理论。放入具体的东西,让我们看看。通常资源来自模型,而不是控制器,但在这种情况下,可能有更聪明的方法来实现它。 – Casper

如果您使用Gretel,那么我认为你可能会寻找的是:

def crumb_resource 
    resource = controller_name 
    resource = controller_name.singularize if edit_or_show_action 

    self.instance_variable_get("@#{resource}") 
end 

这是假设你已经在edit/show/index行动期间存储相关的资源到@resource_name

我接受给出我假设它的工作原理,使用实例变量访问模型,他们认为人的答案,然而在这个工作对我来说到底:

breadcrumb crumb, eval(crumb_resource) 

其中EVAL评估串,基本上反向插值这听起来很酷。

+0

如果是这样的话,那么你要找的是'self.send(resource)'。 – Casper

+0

就这样!非常感谢 – Mark