【问题标题】:Build custom path in Rails view在 Rails 视图中构建自定义路径
【发布时间】:2014-09-26 19:55:12
【问题描述】:

是否可以像这样在 erb 文件中“构建”路径?路径的名称应该取决于对象的类名。正在构建的路径已存在于 routes.rb 文件中。我只想动态选择正在生成的路径的一部分,这样我就不必使用条件和重复代码。

  <% custom_path = "hide_#{object.class}_path" %>
  <%= link_to 'Do something', custom_path(object) %>

上面的例子不起作用,因为我不知道如何正确“使用”新路径。我想我必须通过某种“元”方式“调用”路线?就像 Ruby 中的 object.call(method)。但我不知道如何在 Rails 中做到这一点。

举例说明:假设对象的类是 Car,那么变量中的路径应该是:hide_car_path

上面示例的错误如下所示:

undefined method `custom_path' for #<#<Class:0x00000108afac40>:0x000001091fd3a8>

【问题讨论】:

标签: ruby-on-rails ruby path erb


【解决方案1】:

我们为此使用eval()

<%= link_to 'Do something', eval("custom_#{object.class}_path(object)") %>

我不确定它的作用(像eval 这样的人并不多),我不确定传递的变量是否会在我上面的示例中持续存在,但是我们确实使用以上代码在我们自己的应用程序中

【讨论】:

    【解决方案2】:
    <% custom_path = "hide_#{object.class}_path" %>
    <%= link_to 'Do something', custom_path(object) %>
    

    执行此操作时,您将创建一个名为 custom_path 的变量并将其设置为字符串。然后你调用这个字符串,就好像它是一个方法一样。就像这样做:

    foo = "Bar"
    foo("baz")
    

    就像

    "Bar"("baz")
    

    link_to 的第二个参数只是一个字符串:我们要调用的路径,例如“hide_cars”。路径助手只是在那里帮助您定义该字符串。请注意,实际的网址本身并没有“路径”一词:

    你可以这样做:

    my_path = custom_path(object)
    

    然后做

    link_to "Do Something", my_path
    

    但是,在您的情况下,您希望更改动态调用的路径,这是获取结果字符串的一种复杂方法。这样做可能更简单:

    link_to "Do Something", "/hide_#{object.class.name.undescore.pluralize}"
    

    这假设您要获取的网址是“hide_cars”。

    【讨论】:

      【解决方案3】:

      使用 eval() 来执行此操作。 eval 用于执行以字符串形式出现的内容。

      例如 eval(2+2) # 4

      同样

       <%= link_to 'Do something', eval("hide_#{object.class}_path(object)") %>
      

      【讨论】:

        【解决方案4】:

        感谢您的所有回答。他们没有(仅在我的情况下?)工作,而是将我推向了正确的方向。解决方案与答案有点“不同”,因为我不能只使用类名。

        有效的解决方案是:

          <% path = "approve_#{object.class.to_s.downcase}_path(object)" %>
          <td><%= link_to 'Do something', eval(path) %></td>
        

        如果我执行以下操作,就像我得到的答案一样:

          <% path = "approve_#{object.class}_path(object)" %>
          <td><%= link_to 'Do something', eval(path) %></td>
        

        我收到以下错误:

        undefined method `hide_Car_path' for #<#<Class:0x00000108afac40>:0x00000101bea990>
        

        我认为路径中对象的类必须是小写的。谢谢大家!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-31
          • 1970-01-01
          • 1970-01-01
          • 2022-08-17
          相关资源
          最近更新 更多