Rails帮助程序,link_to选项作为可选项

3

我正在尝试创建一个帮助方法,可以为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并会抛出错误。

有什么想法吗? 谢谢!

2个回答

4
link_to方法仅接受三个参数, 最后一个参数必须是一个哈希。因此,你需要将你的类设置与可选的额外设置哈希合并。
将你的示例更改为:
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进行了转义。这是为了安全起见,因为您通过使用raw禁用了Rails通常执行的自动转义。


1
不要重复造轮子。CSS类是您可以通过选项哈希将其传递给link_to助手的选项之一。让我们将其移动到选项哈希中并删除一个不必要的参数。
# notice class: 'btn-primary' vs 'btn-primary'
<%= toolbar_item(..., class: 'btn-primary', target: '_blank') %>

现在,link_to还可以接受一个块。使用它来简化你的代码,并将图标(“globe”或“flag”等)作为块传递。
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方法中的选项哈希值理解有误,但现在已经清楚了。回答你的问题,如果我真的需要这个方法:是的,我需要,这样我就可以在整个应用程序中的一个地方更改工具栏项目的样式和属性。 - Fernando

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接