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

时间:2017-03-09 22:49:37

标签: ruby-on-rails ruby breadcrumbs

我正在尝试在我的应用程序控制器中创建一个通用的breadcrumbs方法,以根据当前控制器分配面包屑。如果我想要“Thing”索引的面包屑,我需要在视图中:

<%= breadcrumb :things, things %>

编辑或显示:

<%= breadcrumb :thing, thing %>

事物是事物控制器中返回所有事物的方法,而事物是一个返回相关事物的方法。它们都暴露了,我的应用程序布局中有:

<%= 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)

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

2 个答案:

答案 0 :(得分:1)

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

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

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

这假设您已在@resource_name操作期间将相关资源存储到edit/show/index

答案 1 :(得分:0)

我接受了给出的答案,因为我假设它适用于使用实例变量访问其视图中的模型的人,但最终这对我有用:

breadcrumb crumb, eval(crumb_resource)

其中eval评估字符串,基本上是反向插值,听起来很酷。