请注意,这不是一个要求任何有效解决方案的问题,而是一个最佳做法是什么?的问题。
在我的观点中,我有很多像这样的代码(我使用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数组连接是我唯一的选择?
答案 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')
希望这有帮助。