2013-03-27 4 views
0

У меня две модели, Car и Manufacturer. Эти модели довольно просты:Rails - вложенная модель: не может назначить защищенные атрибуты

class Car < ActiveRecord::Base 
    attr_accessible :manufacturer_id, :car_name, :descr, ... 
    belongs_to :manufacturer 
    ... 
end 

и

class Manufacturer < ActiveRecord::Base 
    attr_accessible :name, :url 
    has_many :cars 
    ... 
end 

Вид (views/cars/_form.html.haml) с формой для ввода данных:

= form_for @car do |f| 
    .field 
    = f.label :car_name 
    = f.text_field :car_name 
    ... 
    = f.fields_for @manufacturer do |m| 
    .field 
    = m.label :name 
    = m.text_field :name 
    ... 

Когда я отправить форму для сохранения введенной информации (это идет CarsController), я получаю эту ошибку:

Can't mass-assign protected attributes: manufacturer

Я пытался добавить

accepts_nested_attributes_for :manufacturer

к Car модели, но это не помогло мне ...

Где проблема?

EDIT: Как я храню данные в контроллере:

@manufacturer = Manufacturer.new(params[:car][:manufacturer]) 
@car = @manufacturer.cars.build(params[:car]) 

EDIT2: Данные из журнала:

{"utf8"=>"✓", 
"_method"=>"put", 
"authenticity_token"=>"4vcF5NV8D91DkxpCsqCzfbf05sOYsm7ssxZvPa3+kXo=", 
"car"=>{"car_name"=>"...", 
"descr"=>"...", 
"categroy_ids"=>["2", 
"3", 
"4"], 
"manufacturer"=>{"name"=>"Company", 
"url"=>"..."}}, 
"commit"=>"Save", 
"id"=>"..."} 

Спасибо

+1

Ваши 'params [: car]' содержит атрибуты производителя. Попробуйте следующее: '@manufacturer = Manufacturer.new (params [: car] .delete (: производитель)); @car = @ manufacturer.cars.build (params [: car]) ' – codeit

+0

Пока @codeit находится на месте, вы можете посмотреть на' accepts_nested_attributes' для этой цели. – Matt

+0

codeit - спасибо, но - как обновить действие 'update'? Сохранение нового элемента работает хорошо, но получение такой же ошибки при обновлении данных ... – user984621

ответ

0

Вашего PARAMS [: машина] содержит атрибуты производителя .. Попробуйте это:

@manufacturer = Manufacturer.new(params[:car].delete(:manufacturer)) 
@car = @manufacturer.cars.build(params[:car]) 

Вы не используете has_many отношений, делая таким образом. Вы можете пройти this

+0

Спасибо, что очень много за вашу помощь, как здесь, так и в чате ! – user984621

0

Вы должны добавить

attr_accessible :manufacturer_id, :car_name, :descr, :manufacturer_attributtes

в машине модель. Не беспокойтесь о том, что @manufacturer в вашем методе сохранения в контроллере автомобиля позаботился.

Вы должны прочитать: Active Record Nested Attributes

Я надеюсь, что это помогло.

2

Вы можете сохранить производителя через автомобиль?

Добавить в Автомобиль модель:

accepts_nested_attributes_for :manufacturer 

Добавить manufacturer_attributes среди других автомобилей приписывает attr_accessible вызова в модели автомобиля:

attr_accessible :manufacturer_attributes, :car_name, :descr, ... 

сохранить его в своем действии контроллера (стандартный путь) примерно так:

def create 
    @car = Car.new(params[:car]) 
    if @car.save 
    redirect_to @car 
    else 
    render :new 
end 
end 

Удостоверьтесь, что все, что вы отправляете в manufacturer_attributes hash is white, указанным в списке attr_accessible в модели производителя (: name,: url и т. Д.).

Смежные вопросы