2011-02-05 13 views
2

シリアル化されたハッシュという1つのパラメータを持つモデルがあります。私はレールの機能を内蔵したフォームでハッシュを編集できるようにしたい。 ほぼです。フォームに記入して提出すると、パラメータは正しくシリアル化され、コントローラでモデルは期待値で構築されます。それが崩れるところは、フォームに既存のモデルを表示させたい場合です。値はいずれもフォームフィールドに表示されません。rails:シリアル化されたデータをフォームで編集する

私のモデルは次のようになります。

class Search < ActiveRecord::Base 
    serialize :params 
end 

とフォーム:

<%= form_for @search do |f| %> 
    <%= f.fields_for :params, @search.params do |p| %> 
    <%= p.label :square_footage, "Square Footage:" %> 
    <%= p.text_field :min_square_footage, :size => 10, :placeholder => "Min" %> 
    <%= p.text_field :max_square_footage, :size => 10, :placeholder => "Max" %> 
    <% end %> 
    ... 
<% end %> 

、コントローラの作成方法で:ログに

@search = Search.new(params[:search]) 
@search.params ||= Hash.new 
logger.info("search = #{@search.inspect}") 

search = #<Search id: nil, params: {"min_square_footage"=>"1200", "max_square_footage"=>"1500"}, created_at: nil, updated_at: nil> 

これで値がPOSTされるのがわかります。

<%= @search[:params][:min_square_footage] %> 

そして私は次のことができます。私の見解で

は、フォームの上に、私は、少なくとも値にアクセスできるかどうかを確認するために、この行を追加しました。

私のビューの値にアクセスでき、フォームが正常にコントローラにPOSTすると、フォームにデータが表示されないのはなぜですか?

+0

は私の検索モデルのフィールドです。私はまだ貯蓄を心配していません。私は "@ search.params [:min_square_footage] = 1000"のような値でモデルをプリロードしました。その値はフォームに表示されません。 – emh

答えて

0

これは動作します:

<%= p.text_field :min_square_footage, :size => 10, :placeholder => "Min", :value => @search[:params][:min_square_footage] %> 
<%= p.text_field :max_square_footage, :size => 10, :placeholder => "Max", :value => @search[:params][:max_square_footage] %> 

をしかし、理想的ではありません。レールは自動的にフォームの値を配線する必要がありますか?

0

フォームにデフォルトで値が入力されるためには、オブジェクトとメソッドの関係が必要だと思います。これらのメソッドは、フォームを生成するためにRailsによって呼び出されます。あなたはこの

class Search < ActiveRecord::Base 
    serialize :params 

    def min_square_footage 
    params[:min_square_footage] unless params.blank? 
    end 

    def max_square_footage 
    params[:max_square_footage] unless params.blank? 
    end 
end 

ようにとビューで2件のデータのmin_square_footageとmax_square_footageの検索モデル内のメソッドを書くことができます:はい、paramsは

<%= form_for @search do |f| %> 
    <%= f.label :square_footage, "Square Footage:" %> 
    <%= f.text_field :min_square_footage, :size => 10, :placeholder => "Min" %> 
    <%= f.text_field :max_square_footage, :size => 10, :placeholder => "Max" %> 
    ... 
<% end %> 
+1

私の意見では、 'params'ハッシュを' Search'モデルに直接渡すのは少し臭いです。 – paulus

+0

@ paulus..in OPの場合、 'Search'モデルに対応する' searches'テーブルにフィールド 'params'があります。コードを見ると、 'params'ハッシュを' Search'モデルに渡すわけではありません。 – rubyprince

関連する問題