将字符串转换为控制器方法调用
Converting a string into a controller method call
我正在尝试在我的应用程序控制器中创建一个通用面包屑方法,以根据当前控制器分配面包屑。如果我想要 'Thing' 索引的面包屑,我需要在视图中:
<%= breadcrumb :things, things %>
编辑或展示:
<%= breadcrumb :thing, thing %>
where things is a method in the things controller that returns all things, thing is a method returning the relevant thing.Both are exposed, and I have in my application layout:
<%= 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
这显然是returns一个字符串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
。
我接受了给出的答案,因为我假设它适用于使用实例变量访问他们视图中的模型的人,但最终这对我有用:
breadcrumb crumb, eval(crumb_resource)
其中 eval 评估字符串,基本上是反向插值,这听起来很酷。
我正在尝试在我的应用程序控制器中创建一个通用面包屑方法,以根据当前控制器分配面包屑。如果我想要 'Thing' 索引的面包屑,我需要在视图中:
<%= breadcrumb :things, things %>
编辑或展示:
<%= breadcrumb :thing, thing %>
where things is a method in the things controller that returns all things, thing is a method returning the relevant thing.Both are exposed, and I have in my application layout:
<%= 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
这显然是returns一个字符串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
。
我接受了给出的答案,因为我假设它适用于使用实例变量访问他们视图中的模型的人,但最终这对我有用:
breadcrumb crumb, eval(crumb_resource)
其中 eval 评估字符串,基本上是反向插值,这听起来很酷。