1

だから私は、このプロ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

そして、許可されていないパラメーターが見つかりました:オプションエラーが発生しました。

4

1 に答える 1