1

我正在尝试创建一个模型表单,该表单允许我通过<select>标签按名称添加引用。

例如

在数据库中已经有带有ref_name = "a", ref_name = "b",的 RefModels 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

这些 ref_model 是否有 ID 和名称?如果是这样,您可以让 Rails 为您完成繁重的工作。

在您看来,请执行以下操作:

<%= f.select :ref_model_ids, RefModel.all.collect {|x| [x.name, x.id]}, {}, :multiple => true %>

然后,您可以从控制器中取出自定义代码,Rails 知道如何正确链接这些模型。假设您有一个类似 model_ref_model 的表,其中包含 model_id 和 ref_model_id 列。

希望有帮助...

于 2013-06-25T19:50:33.880 回答
1

错误来自这部分:

@model = Model.new(model_params)

我很确定你model_params实际上是params[:model]。如果是,则意味着它尝试为 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 回答