簡體   English   中英

Rails - 嵌套模型:無法批量分配受保護的屬性

[英]Rails - nested model: Can't mass-assign protected attributes

我有兩個型號, CarManufacturer 這些模型非常簡單:

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 )時,我收到此錯誤:

無法批量分配受保護的屬性:制造商

我試過添加

accepts_nested_attributes_for:制造商

Car模型,但它沒有幫助我...

問題出在哪兒?

編輯:我如何在控制器中保存數據:

@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"=>"..."}

謝謝

你能通過汽車節省制造商嗎?

添加到汽車模型:

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散列中發送的所有內容都是白色,並在制造商模型中使用attr_accessible調用(:name,:url等...)。

你需要添加

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

在汽車模型。 不要在車載控制器的保存方法中使用@manufacturer來處理它。

您應該閱讀: Active Record Nested Attributes

我希望它有所幫助。

你的參數[:car]包含制造商屬性..試試這個:

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

您沒有通過這種方式使用has_many關系。 你可以通過這個

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM