10

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 %>

したがって、値が「Some value」の入力ボックスでフォームを表示する必要がありますが、空白です。simple_formで動作をオーバーライドしないのはなぜですか?

4

2 に答える 2

13

私はこれを理解しました、私のコメントは基本的に正しかったです.ActiveRecordオブジェクトから値を取得するためにsimple_form使用するRailsフォームヘルパーに依存しているため、メソッドを使用せずにデータベース内の値を読み取ります. read_attribute永続性/ドメイン/プレゼンテーションの結合の兆候。これを回避する方法は次のとおりです。

 <%= 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 %>

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

于 2012-08-26T22:50:32.790 に答える