Rails 辅助方法,link_to 选项作为可选项
Rails helper method with link_to options as optionals
我正在尝试创建一个可以为 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 并引发错误。
有什么想法吗?
谢谢!
不要重新发明轮子。 CSS class 是一个选项,您可以通过选项散列传递给 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
方法只接受 3 个参数。最后一个参数需要是一个散列。因此,您必须将 class 设置与可选的额外设置哈希合并。
将您的示例更改为:
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
来转义您的 icon
和 text
。为了安全起见,因为您禁用了通常由 Rails 使用 raw
.
完成的自动转义
我正在尝试创建一个可以为 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 并引发错误。
有什么想法吗? 谢谢!
不要重新发明轮子。 CSS class 是一个选项,您可以通过选项散列传递给 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
方法只接受 3 个参数。最后一个参数需要是一个散列。因此,您必须将 class 设置与可选的额外设置哈希合并。
将您的示例更改为:
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
来转义您的 icon
和 text
。为了安全起见,因为您禁用了通常由 Rails 使用 raw
.