我正在尝试创建一个模型表单,允许我通过<select>
标记按名称添加引用。
e.g。
在数据库中,已存在包含ref_name = "a"
,ref_name = "b"
,ref_name = "c"
的RefModel。
形式:
<%= 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)
答案 0 :(得分: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
{{1}}
答案 1 :(得分:1)
这些ref_models是否具有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的列。
希望有帮助...