2013-06-25 3 views
1

Я пытаюсь создать форму модели, которая позволит мне добавлять ссылки по имени с помощью тега <select>.Rails форму для создания модели со ссылкой

например.

В базе данных уже есть RefModels with ref_name = "a", ref_name = "b", 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' 

В чем проблема?

Примечание:

Я изменил фактические названия модели для «модели» и «ref_model» обобщать.

EDIT: ошибка происходит на этой линии:

@model = Model.new(model_params) 

ответ

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

ли эти ref_models имеют идентификаторы, а также имена? Если это так, вы можете получить 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.

Надеюсь, что это поможет ...