将字符串转换为控制器方法调用
问题描述:
我试图在我的应用程序控制器中创建通用面包屑方法,以基于当前控制器分配面包屑。如果我想为“东西”的指数的面包屑,我需要在视图中:将字符串转换为控制器方法调用
<%= 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)
显然不起作用。如何将返回的字符串转换为控制器方法调用?
答
如果您使用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
。
您需要调用控制器方法的原因是什么?在大多数情况下,控制器方法会生成视图,或者是可以从视图访问的辅助方法。通常你不应该从另一个控制器中调用一个控制器。那么为什么你需要'controller.send(resource)'? – Casper
因为我不知道另一种方式将资源字符串转换成我正在寻找的对象如果你正在访问视图中的对象,我认为最好通过控制器调用完成,但是我不'我不想单独硬编码每一个,这就是为什么我试图将'资源'字符串转换为视图调用的控制器方法。如果我接近它错误或有更好的方法,请让我知道。 – Mark
你可能做错了什么,但可能不会。我认为你需要用你期望的具体例子来编辑你的答案。现在我们只是在这里谈论抽象理论。放入具体的东西,让我们看看。通常资源来自模型,而不是控制器,但在这种情况下,可能有更聪明的方法来实现它。 – Casper