だから私は、このプロRailscast http://railscasts.com/episodes/403-dynamic-formsに基づいて動的フィールドを使用する3.0アプリケーションを書き直し/アップグレードしています。
動的フィールドをロードする方法は、次のコードを使用します。
<%= f.hidden_field :tour_type_id %>
<%= f.fields_for :options, OpenStruct.new(@trip.options) do |builder| %>
<% @trip.tour_type.type_fields.where(:variable => false).each do |field| %>
<%= render "type_fields", field: field, f: builder %>
<% end %>
<% end %>
これはhtmlを正しくレンダリングしています。
コンソールから作成を実行すると、:options に渡すハッシュが正しく保存されます。ただし、フォームから値を送信すると、ハッシュの値が nil として保存されます。
おそらく、コントローラーにある強力なパラメーターが原因だと思います。
def trip_params
params.require(:trip).permit(:options => {:id => :value})
end
私も試しました
def trip_params
params.require(:trip).permit(:options => {})
end
パラメータは Rails サーバー ログで問題ないように見えますが、どういうわけか、更新が発生する前にオプションの値が nil に設定されています。
Processing by TripsController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"...", "trip"=>{"options"=>{"1"=>"400"}}, "commit"=>"Update Trip", "id"=>"1"}
SQL (1.0ms) UPDATE "trips" SET "updated_at" = $1, "options" = $2 WHERE "trips"."id" = 1 [["updated_at", Mon, 26 Aug 2013 05:13:35 UTC +00:00], ["options", "--- !ruby/hash:ActionController::Parameters\n'1': \n"]]
また、シリアル化アクションをモデルに追加しました
class Trip < ActiveRecord::Base
serialize :options, Hash
end
このコードが Rails v 4、Ruby V 1.9.3 で機能しない理由がよくわかりません。
このコードは、動的フォーム RailsCast からモデル化されています。
編集:
ここで概説したソリューションを試しましたhttp://guides.rubyonrails.org/action_controller_overview.html#outside-the-scope-of-strong-parameters
def trip_params
params.require(:trip).permit(
:admin_name,
:brochure_title,
:description,
:organized_by,
:start_date,
:end_date,
:tour_type_id,
:pay_by,
:extension
).tap do |whitelisted|
whitelisted[:options] = params[:trip][:options]
end
end
そして、許可されていないパラメーターが見つかりました:オプションエラーが発生しました。