2011-12-29 3 views
3

私はレンダリングしたいHAMLテンプレートを持っています。オプションで、ここではpostと呼ばれるローカル変数を提供して、提供された変数を要素属性の値として使用するか、明示的なデフォルトに戻します。HAMLの地方のためのデフォルト値の使い方は?

以下のコードは、私が意味することを示していますが、postが提供されていないと実行に失敗します。これにはクリーンな解決策がありますか?私はこれらのフィールドのかなりの部分を持っているので、私は考えることができる唯一の他の選択肢である- if defined?ステートメントでそれらを複製し続ける必要はありません。

%label 
    Post title 
    %input{:name => "title", 
     :value => (defined? post) ? post.title : ""} } 
+1

は、任意の変数を持つ部分的にerbですが、通常は 'post || = nil'とだけ言います。次に、未定義の変数例外を打つことなく、条件付きロジックを実行できます。 –

答えて

0

実際の問題は、SinatraがHTTP投稿のハンドラを定義するpostメソッドを定義しており、HAMLレンダラがこれを見ることができるということでした。

テンプレートが正常に動作しますが、それ以外postは実際には関数であり、したがってdefined?が真であるが、明確に何titleプロパティがありませんので、あなたは、それはそれを隠しレンダラにpost変数を提供した場合。

変数の名前を変更するだけで、すべてが期待どおりに機能します。

+0

あなたはそれを理解してうれしいです。私はそれを考えなければなりませんでした。 – Batkins

1

これはこれをやってみてください。

%input{:name => "title", :value => post ? post.title : ""} 

nilは、Rubyインタプリタに偽として扱われるので、あなたが定義されてチェックする必要はありません。 Eloquent Ruby by Russ Olsenからのこの抜粋は最高のそれを説明します

Rubyで

は、唯一falsenilfalseとして扱われます。 Rubyは他のすべてを扱います - そして私はすべてを意味します - trueとして。

これはRailsのアプリであれば、より説得力のあるソリューションは、Railsのtry方法を使用することです:try方法がない限り、クラスに渡されたのシンボルで識別されるメソッドを呼び出す

%input{:name => "title", :value => post.try(:title)} 

をクラス自体はnilです。この場合、nil(hamlは自動的に空文字列に変換されます)を返します。 Read more about the rails try method here

0

いくつかの変数がnilである場合に対処する場合は、tryメソッドを使用できます。例:

%input{:name => "title", :value => post.try(:title) } } 

投稿がnilの場合、nilを返します。それ以外の場合は、post.titleが返されます。明示的なデフォルト値を提供する場合

しかし、あなたはヘルパー(default_if_nilのようなもの)やサルパッチのデフォルト値を指定することができるようにするtry方法を記述しなければならないのいずれか。

+0

ちょうど参考までに、これはsinatraアプリケーションでは動作しません。これは、 'Rails'のクラスに追加されるメソッドなのでです。このメソッドはRubyやSinatraには存在しません。それについての詳細は、私の答えの一番下を見てください。 – Batkins

関連する問題