从 Rails Helper 返回多个标签的最佳方法是啥?

Posted

技术标签:

【中文标题】从 Rails Helper 返回多个标签的最佳方法是啥?【英文标题】:What is the best way to return multiple tags from a Rails Helper?从 Rails Helper 返回多个标签的最佳方法是什么? 【发布时间】:2010-09-11 20:23:33 【问题描述】:

我想创建一个隐藏字段并在一个助手中创建一个链接,然后将两者都输出到我的 erb。

<%= my_cool_helper "something", form %>

应该把结果放出来

link_to "something", a_path
form.hidden_field "something".tableize, :value => "something"

助手的定义是什么样的? link_to 和 form.hidden_​​field 的细节并不重要。重要的是,我如何从两个不同的调用返回输出。

【问题讨论】:

记住since Rails 3你需要将字符串标记为html_safe以避免XSS攻击。 【参考方案1】:

有几种方法可以做到这一点。

请记住,现有的 Rails 助手,如 link_to 等,只是输出字符串。您可以将字符串连接在一起并返回(如果事情很简单,这是我大部分时间所做的)。

EG:

link_to( "something", something_path ) +  #NOTE THE PLUS FOR STRING CONCAT
  form.hidden_field('something'.tableize, :value=>'something')

如果您正在做更复杂的事情,您可以将该代码放在一个部分中,并让您的助手调用render :partial

如果你做的事情甚至比这更复杂,那么你可能想看看 errtheblog 的 block_to_partial 助手,这很酷

【讨论】:

不错且简单的答案!加上 FTW!【参考方案2】:

到目前为止,我想出的最好的是:

def my_cool_helper(name, form)
  out = capture  link_to name, a_path 
  out << capture  form.hidden_field name.tableize, value => 'something' 
end

有没有更好的办法?

【讨论】:

你的回答对我帮助很大。谢谢!【参考方案3】:

使用safe_join

我通常更喜欢与+ 连接,如Orion Edwards's Answer 所示,但这是我最近发现的另一个选项。

safe_join( [
  link_to( "something", something_path ),
  form.hidden_field( "something".tableize, value: "something" )
] )

它具有显式列出所有元素以及这些元素的连接的优点。

我发现对于长元素,+ 符号可能会在行尾丢失。此外,如果您要连接多个元素,我发现将它们列在这样的数组中对下一位读者来说更明显。

【讨论】:

【参考方案4】:

如果你想缓冲除字符串之外的其他输出,那么你可以使用concat 而不是+。 看到这个 - http://thepugautomatic.com/2013/06/helpers/

【讨论】:

【参考方案5】:
def output_siblings
  div1 = tag.div 'some content'
  div2 = tag.div 'other content'

  div1 + div2
end

这里只是简化了一些其他的答案。

【讨论】:

【参考方案6】:

这对我有用。

def format_paragraphs(text)
  text.split(/\r?\n/).sum do |paragraph|
    tag.p(paragraph)
  end
end

【讨论】:

以上是关于从 Rails Helper 返回多个标签的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

将 html5 数据属性与 rails content_tag helper 一起使用的最佳方法?

在 Rails 数据库中存储和稍后访问 JSON 对象的最佳实践

从 Rails 中清理 JSON 的最佳方法

如何测试作为 helper_method 公开的 Rails 控制器方法?

我可以在返回 html 的自定义 Tag Helper 中使用 Tag Helper 吗?

ruby Rails Test Helper rails_helper.rb