1

私のパーシャルのいくつかは、2 つの「モード」でレンダリングできます。の場合、いくつかのフィールドfull_displayfalseレンダリングしません。物事を簡単にするために、「モード」の 1 つをデフォルトにしたいと思いました。full_displayが定義されていない場合は、 として扱いますfalse。私はこのコードを思いつきました:

(((not defined?(full_display).nil?) && full_display) || false)

かなり動き回ります。ヘルパーなどに入れればいいのですが、Rubyはレキシカルスコープしかないのでいい方法が思い浮かびません。

私がすでに試した悪いアイデア:

  • 部分的な do<% display = long code that is above %>と use の上にコードを表示しますが、ビューでローカル変数を作成すると見栄えが悪く、すべての部分的な using にコピーする必要がありますfull_display
  • 文字列内にラップし、ヘルパーに入れ、ビューで eval(display_helper) を使用しますが、明らかにこれによりセキュリティ上の懸念が生じます。
4

1 に答える 1

2

これは、次のような単純なことを言うための非常に複雑な方法です。

defined?(full_display) && full_display

Rubyには、trueではない2つの値がnilありfalse、他のすべての値はtrueと評価されます。これには、0、空の文字列などが含まれ、Perl、PHP、およびCではfalseと評価されます.nil?。未定義とを区別したいというまれなケース。falseこれは、欠落値がfalse値と異なるブールフィールドの場合です。

いずれの場合も、ビュースペースでは、次の||=ようにor-equals演算子を使用してデフォルトを割り当てる方がはるかに簡単です。

<% full_display ||= false %>

これは。と同等full_display = full_display || falseです。これは2つのことを行います。まず、full_display以前に作成されていなくても変数を定義し、次に、少なくともfalse未定義ではない値が含まれるようにします。

||= defaultRubyコードでは、他の場合に何かを割り当てるのが簡単な方法であるため、パターンがよく見られnilます。

于 2010-11-19T17:35:46.070 に答える