2012-05-26 5 views
10

私はsimple_formを使用しており、モデル属性の読者を上書きしたいと考えています。したがって、以下モデル属性リーダーを無効にするとsimple_form入力フィールドに影響しません

ビューで

class C < ActiveRecord::Base 

    # it has attribute named pack 

    def pack 
    "Some value" 
    end 

end 

機能しない次のコード

<%= simple_form_for @c do |f| %> 
    <%= f.input :pack %> 
<% end %> 

は、このように、それが値を有する入力ボックスと「いくつかの値を」フォームを表示する必要があり、それがブランクです。なぜsimple_formで作業をオーバーライドしないのですか?

+0

私は同じ問題を抱えている、私の推測では、 'simple_form'、または可能性が高いレールである'、ヘルパーを形成read_attribute' '使用の代わりに、 s ActiveRecordオブジェクトから入力値を取得します。 – Kris

答えて

12

これはわかりましたが、私のコメントは基本的には正しくありました。は、read_attributeを使用して、ActiveRecordオブジェクトから値を取得し、メソッドを使用しないで値を取得するRailsフォームヘルパを利用しています。永続性/ドメイン/プレゼンテーションのカップリングの症状。これを回避する方法は次のとおりです。

<%= f.input :pack, :input_html => { :value => @c.pack } %> 
# or 
<%= f.input :pack, :input_html => { :value => f.object.pack } %> 

それとも、これはデフォルトの動作になりたい場合は、次のようなsimple_forの上に独自のフォームビルダを作成することができます。

# lib/my_form_builder.rb ** 

class MyFormBuilder < SimpleForm::FormBuilder                        
    def input(attribute_name, options={}, &block)         
    options[:input_html] ||= {}             
    options[:input_html][:value] = object.send(attribute_name)     
    super(attribute_name, options, &block)               
    end 
end 

そして、あなたの形で:

<%= simple_form_for @c, :builder => MyFormBuilder do |f| %> 
    <%= f.input :pack %> 
<% end %> 

** in Rails 3 libがデフォルトでロードパスに追加されているとは思わないので、追加してアプリを再起動する必要がありますまたはapp/modelsに入れてください(免責事項は良い考えではありませんが、libはより良いです)。

5

少なくともRails 3.2では、read_attributeを直接使用していません。しかし、テキストフィールドを使用している場合は、InstanceTag.value_before_type_castを使用して値を取得します。これは、使用しています:

object.respond_to?(method_name + "_before_type_cast") ? 
    object.send(method_name + "_before_type_cast") : 
    object.send(method_name) 

(METHOD_NAMEは、そのコンテキスト内の属性の名前です)

をですから、次の別名を追加し、フォームはあなたの属性のアクセサを使用していることを確認したい場合:

私の作品
alias pack_before_type_cast pack 

、そこに文字列を返すことを確認してください...

+0

私のために働いた。 :) –

+0

私のために働いた。 'alias_method'を使用しなければならなかった –

関連する問題