【问题标题】:Converting a string into a controller method call将字符串转换为控制器方法调用
【发布时间】:2017-03-09 22:49:36
【问题描述】:

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

<%= breadcrumb :things, things %>

对于编辑或显示:

<%= breadcrumb :thing, thing %>

things 是 things 控制器中返回所有事物的方法,而 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)

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

【问题讨论】:

  • 你需要调用控制器方法的原因是什么?在大多数情况下,控制器方法会生成视图,或者是您可以从视图中访问的辅助方法。通常,您不应该从另一个控制器调用一个控制器。那么为什么需要controller.send(resource)
  • 因为我不知道另一种将资源字符串转换为我正在寻找的对象的方法。如果您根据需要访问视图中的对象,我认为最好通过控制器调用,但是我不想单独对每一个进行硬编码。这就是为什么我试图将“资源”字符串转换为控制器方法以供视图调用。如果我的方法有误或有更好的方法,请告诉我。
  • 你可能做错了什么,但也许不是。我认为您需要使用您所期望的具体示例来编辑您的答案。现在我们在这里只讨论抽象理论。放入一些具体的东西,让我们看看。通常资源来自模型,而不是控制器,但在这种情况下,也许有更聪明的方法来做到这一点。

标签: ruby-on-rails ruby breadcrumbs


【解决方案1】:

如果您使用的是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

【讨论】:

    【解决方案2】:

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

    breadcrumb crumb, eval(crumb_resource)
    

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

    【讨论】:

    • 如果是这样,那么您要查找的是self.send(resource)
    猜你喜欢
    • 2011-09-13
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多