2010-11-19 9 views
1

私の一部のいくつかは、2つの「モード」でレンダリングできます。 full_displayfalseの場合、私はいくつかのフィールドを描画しません。簡単にするために、私は "モード"のいずれかをデフォルトにしたいと思っていました。full_displayが定義されていない場合は、falseとして扱います。私はこのコードを思いついた。Railsで動的スコープヘルパーを作成する

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

かなり動き回っている。それをヘルパーなどの中に入れていいのですが、Rubyは字句的な範囲しか持たないので、それを行う良い方法は考えられません。私はすでに試した

悪いアイデア:部分の上に

  • <% display = long code that is above %>を行うと、コードの表示を使用しますが、ビュー内のローカル変数を作成することは、悪い見て、すべての中にコピーする必要があります部分的にfull_displayを使用します。
  • これを文字列の中にラップし、ヘルパーに入れ、eval(display_helper)を使用して表示しますが、明らかにセキュリティ上の懸念が生じます。以下のような単純なものを言うのは非常に複雑な方法です

答えて

2

:Rubyで

defined?(full_display) && full_display 

2つの非該当する値、nilfalseがあり、他はすべて0を含む、真として評価通常、Perl、PHP、およびCではfalseと評価される空文字列です。.nil?でのテストは通常​​、falseと未定義の区別が必要なまれなケースに予約されています。これはブール値フィールド欠損値は偽値とは異なります。 full_display = full_display || falseと同等です

<% full_display ||= false %> 

:いずれの場合で

は、ビュー空間では、このようなまたは-等しい演算子||=を使用してデフォルト値を割り当てることがずっと簡単です。これは2つのことを行います。まず、以前に作成されていなくてもfull_display変数を定義し、次にそれが少なくともfalseの値を含み、未定義でないことを保証します。

Rubyコードでは||= defaultパターンが多く表示されますが、それ以外の場合はnilになるように簡単に割り当てることができます。

+0

これは私のコードよりもはるかに優れています、ありがとう!動的にスコープされたヘルパーを持つことは、より良い(そしてより強力な)でしょう。 –