1

これは実用的な解決策を求める質問ではなく、ベスト プラクティスは何かという質問であることに注意してください。親切。

ビュー全体で、次のようなコードがたくさんあります (私は HAML を使用しています)。

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

さまざまな場所で使用されるとすぐに、ヘルパーに抽出することにしました。しかし、私はそれを行うための最もクリーンな方法が何であるかを理解していないことに気付きました.

+文字列の連結 ( )、文字列の書式設定 ( "%s %s %s" % [...])、または配列の結合 ( )を使用することを考えることができますが[...].join("\n")、これらの方法はすべて、他のオブジェクト (文字列、配列) を構築したり、区切り記号 (" "または"\n"html_safe3つの文字列を宣言するだけでなく、面倒です。

私はそれ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)

もちろん部分的に抽出することもできますが、3 行のコードでは多すぎるようです。

そうは言っても、HTML で強化された 3 つの行をヘルパーで連結するためのクリーンでエレガントな方法が欠けているのでしょうか、それともconcat/partial/dirty 配列の結合しか選択肢がないのでしょうか?

4

1 に答える 1

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')

お役に立てれば。

于 2012-12-05T12:55:49.603 に答える