2

こんにちは、私はこの種のコードを持っています:

= link_to some_url do
  PLENTY OF MARKUP HERE

ここで、このリンクをオプションにする必要があるため、条件が満たされない場合は、プレーンなマークアップを印刷する必要があるため、最初のアンチ DRY ソリューション:

- if condition
  = link_to some_url do
    PLENTY OF MARKUP HERE
-else
  PLENTY OF MARKUP HERE REPEATED :(

パーシャルに入れる場合の別のソリューションPLENTY OF MARKUPなので、パーシャルのない別の単純なソリューションはどこにあるのでしょうか。私はこれを試しました:

= link_to_if condition?, some_url do
  PLENTY OF MARKUP HERE

残念ながらlink_to_if、ここでは期待どおりに機能しません。

4

2 に答える 2

1

link_to_ifとは異なる目的でブロックを使用しlink_toます。したがって、あなたが望むことはできません。

独自のヘルパーを定義して、必要なことを行うことができます。

これを数回だけ行う必要がある場合は、カスタム ヘルパーを使用する代わりに、ブロックの結果 ( PLENTY OF MARKUP) をローカル変数に保存して、簡単に繰り返し使用できるようにすることができます。例えば:

- plentyofmarkup = do
  PLENTY OF MARKUP HERE

- if condition
  = link_to (raw plentyofmarkup), some_url
- else
  = raw plentyofmarkup

または、次のようにします。

= link_to_if condition, (raw plentyofmarkup), some_url

このraw関数は、Rails が文字列を自動的にエスケープするのを止めるために使用されることに注意してください。

独自のヘルパー メソッドを定義するには、次を試してください。

def link_to_if_do condition, options = {}, html_options = {}
  blockresult = yield
  link_to_if condition, blockresult, options, html_options
end
于 2012-09-06T08:46:13.050 に答える
0

いつでも独自の条件付きリンク ヘルパーを作成し、それを application_helper に配置できます。

def conditional_link_to( condition, url, options = {}, html_options = {}, &block ) do
  if condition
    link_to(name, options, html_options, &block)
  else
    if block_given?
      block.arity <= 1 ? capture(name, &block) : capture(name, options, html_options, &block)
    else
      name
    end
  end
end

これは主にlink_to_unlessから取られていますが、ブロックを link_to に渡すように変更されています。私はこれをテストしていませんが、アイデアを得るには十分なはずです。:)

于 2012-09-06T08:45:32.210 に答える