Rails视图助手中的干净和惯用的字符串连接

时间:2012-12-05 12:42:46

标签: ruby-on-rails actionview

请注意,这不是一个要求任何有效解决方案的问题,而是一个最佳做法是什么?的问题。

在我的观点中,我有很多像这样的代码(我使用HAML):

= t("some.key")
%b= t("other.key.#{string}")
%i= string

一旦在许多不同的地方使用它,我决定将其提取给帮助者。但我意识到我不明白什么是最干净的方法。

我可以考虑使用字符串连接(+),字符串格式化("%s %s %s" % [...])或数组连接([...].join("\n")),但所有这些方法对我来说都有点过分,因为我必须构建一些其他对象(字符串,数组)或指定分隔符(" ""\n")并烦扰html_safe而不是仅仅声明三个字符串。

我认为concat应该以这种方式工作

def long_string(string)
  concat t("some.key")
  concat content_tag(:b, t("other.key.#{string}"))
  concat content_tag(:i, t(string)
end

......它有效,但它迫使我执行帮助器而不是评估它,这不是惯用的,我的意思是使用

%p- long_string(string)

而不是

%p= long_string(string)

当然我可以将它提取到一个部分,但对于三行代码似乎很多。

那就是说,我是否缺少一些干净而优雅的方法来连接帮助器中的三个HTML丰富的行,或者concat / partial / dirty数组连接是我唯一的选择?

1 个答案:

答案 0 :(得分:0)

如果它是很多HTML我肯定会去提取部分。在我个人看来,没有什么能比HAML更清晰地写和读HTML了。

如果是一堆字符串插值,组成了很多值,我有时会使用帮助器来清理我的视图,但是它们总是会返回字符串,我从不使用concat在我的助手中,这使我的助手也更容易测试(只需检查字符串结果是否符合我的预期)。

因此,对于您的示例,它将是

def long_string(str)
  result = []
  result << t("some.key")
  result << content_tag(:b, t("other.key.#{string}"))
  result << content_tag(:i, string)
  result.join(" ").html_safe
end

在你看来你可以写

%p= long_string('whatevvva')

希望这有帮助。