1

<select>タグを介して名前で参照を追加できるモデル フォームを作成しようとしています。

例えば

ref_name = "a"データベースには、 、ref_name = "b"、 のRefModel が既に存在しますref_name = "c"

形:

<%= form_for @model %>
  <%= f.label :ref_models, "Referenced Models:" %>
  <%= f.select :ref_models, ["a","b","c"], {}, {:multiple => true} %>

コントローラ:

def create
  @model = Model.new(model_params)
  params[:model][:ref_models].each do |ref|
    @ref = RefModel.where("ref_name = ?", ref)
    @model.ref_models << @ref
  end
  respond_to do |format|
    ...
  end
end

ログに次のエラーが表示されます。

Started POST "/models" for 127.0.0.1 at 2013-06-25 16:20:48 -0300
Processing by ModelssController#create as JS
  Parameters: {"utf8"=>"✓", "models"=>{..., "ref_models"=>["a", "b", "c"], ...}, "commit"=>"Create"}
Completed 500 Internal Server Error in 2ms

ActiveRecord::AssociationTypeMismatch (RefModel(#70144007274440) expected, got String(#70144005442620)):
  app/controllers/models_controller.rb:52:in `create'

どうしたの?

ノート:

「model」と「ref_model」の実際のモデル名を一般化するために変更しました。

編集: エラーはこの行で発生します:

@model = Model.new(model_params)
4

2 に答える 2

1

エラーはこの部分から来ています:

@model = Model.new(model_params)

私はあなたmodel_paramsが実際にあると確信していますparams[:model]ref_modelsはいの場合、属性と値が含まれるモデルのレコードを作成しようとすることを意味しますparams[:model][:ref_models]

params[:model][:ref_models]に渡す前に を外す必要がありModel.new(params[:model])ます。

def create
  ref_models = params[:model].delete(:ref_models)
  @model = Model.new(params[:model])
  ref_models.each do |ref|
    @ref = RefModel.where("ref_name = ?", ref)
    @model.ref_models << @ref
  end
  respond_to do |format|
    ...
  end
end
于 2013-06-25T19:43:59.137 に答える