【问题标题】:Rails helper method with link_to options as optionals使用 link_to 选项作为选项的 Rails 辅助方法
【发布时间】:2016-06-01 23:54:52
【问题描述】:

我正在尝试创建一个辅助方法,它可以为 link_to 方法提供可选参数。我的目的是为不同的情况创建一个辅助方法:

# Typical case #1 (can have any number of extra arguments)
<%= toolbar_item('google.com', 'Google', 'globe', 'btn-primary', target: '_blank') %>

# Typical case #2 (extra arguments are optional)
<%= toolbar_item(root_path, 'Start', 'flag', 'btn-primary') %>

按照代码:

def toolbar_item(url,text,icon,custom_class, optional_extra_settings = {})
  link_to raw("<i class='fa fa-#{icon}'></i> #{text}"), url, class: custom_class, optional_extra_settings
end

这不好。 link_to 方法无法识别 extra_settings 并引发错误。

有什么想法吗? 谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby methods link-to helpermethods


    【解决方案1】:

    link_to 方法只接受 3 个参数。最后一个参数需要是一个哈希。因此,您必须将您的班级设置与可选的额外设置哈希合并。

    将您的示例更改为:

    def toolbar_item(url, text, icon, custom_class, optional_extra_settings = {})
      html_options = { class: custom_class }.merge(optional_extra_settings)
      link_to raw("<i class='fa fa-#{h icon}'></i> #{h text}"), url, html_options
    end
    

    此外,您会注意到我使用h 来逃避您的icontext。为了安全起见,因为您禁用了 Rails 通常使用 raw 完成的自动转义。

    【讨论】:

      【解决方案2】:

      不要重新发明轮子。 CSS 类是一个选项,您可以通过选项散列传递给 link_to 助手。让我们将其移至选项哈希并删除一个不必要的参数。

      # notice class: 'btn-primary' vs 'btn-primary'
      <%= toolbar_item(..., class: 'btn-primary', target: '_blank') %>
      

      现在,link_to 也接受一个块。使用它来简化您的代码,将图标(“地球”或“标志”等)作为一个块传递。

      def toolbar_item(url, text, options = {}, &block)
        if block_given?
          link_to url, options do
            yield
          end
        else
          link_to text, url, options
        end
      end
      

      现在,每次使用带有图标的助手时,都可以指定所需的图标:

      <%= toolbar_item 'google.com', class: 'btn-primary' do %>
        <%= content_tag :i, class: 'globe' %> Google
      <% end %>
      

      这引出了问题。毕竟你真的需要一个帮手吗?我们所做的只是创建一个包装器。你可以这样做:

      <%= link_to 'Google', 'google.com', class: 'btn-primary' %>
      
      <%= link_to 'Google', class: 'btn-primary' do %>
        <%= content_tag :i, class: 'globe' %> Google
      <% end %>
      

      【讨论】:

      • 它也很好用!正如你们所解释的,我弄错了原始 link_to 方法的选项哈希,但现在很清楚了。回答您的问题,如果我真的需要这种方法:是的,我需要,所以我可以在一个地方更改整个应用程序中工具栏的样式和属性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      • 1970-01-01
      相关资源
      最近更新 更多