Ruby on rails 如何在params散列中获取数据?

Ruby on rails 如何在params散列中获取数据?,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我有一个汽车模型和一个品牌模型(每一个模型都有一个和多个)。我正在努力为一辆汽车创造一个新品牌。汽车模型接受品牌的嵌套属性 当我尝试 @car = Car.find(params[:car_id]) @brand = @car.brands.build(params[:brand]) 我得到一个质量分配错误: Can't mass-assign protected attributes: brands 品牌总监: class BrandsController < Application

我有一个汽车模型和一个品牌模型(每一个模型都有一个和多个)。我正在努力为一辆汽车创造一个新品牌。汽车模型接受品牌的嵌套属性

当我尝试

@car = Car.find(params[:car_id])
@brand = @car.brands.build(params[:brand])
我得到一个质量分配错误:

Can't mass-assign protected attributes: brands
品牌总监:

class BrandsController < ApplicationController
 def create
  debugger
  @car = Car.find(params[:car_id])
  @brand= @car.brands.build(params[:brand])
  if @brand.save
   redirect_to @car
  else
   #do something
  end
 end 
end
显示:

"brand"=>{"brands"=>{"name"=>"BMW"}},
"commit"=>"Create Brand",
"action"=>"create",
"controller"=>"brands",
"car_id"=>"4"}
视图如下所示:

<%= form_for([@car, @car.brands.build]) do |f| %>
    <div class="field">
        <%= f.fields_for :brands do |a| %>
            <%= a.text_field :name, placeholder: "New Brand" %>
        <% end %>
    </div>
    <p><%= f.submit %></p>
<% end %>
编辑:

我可以通过“params[:brand][:brands][:name]”获取品牌名称。现在发现brands表没有汽车id,因为它通过联接表连接到汽车。


<%= form_for @car do |f| %>
  <div class="field">
    <%= f.fields_for :brands do |a| %>
        <%= a.text_field :name, placeholder: "New Brand" %>
    <% end %>
  </div>
<p><%= f.submit %></p>
<% end %>

在您的模型中:

class Car < ActiveRecord::Base
  has_many :brands
  accepts_nested_attributes_for :brands
  attr_accessible :brand_attributes
end
class-Car
尽管在某些情况下,让一个模型接受另一个模型的属性是一个有用的工具,但它往往很麻烦,不仅在模型级别,而且在控制器和视图层都违反了单一责任原则。如果您的设计需要更改,最终会使重构变得更加困难

遵循休息的理念,而不是通过汽车创造品牌,使用品牌控制器来处理品牌的生命周期

至于您对安全性的要求,手动设置模型的属性并不能提供更多的安全性,前提是您正确使用attr_accessible,然后再传递整个params散列。给它一个可接受参数的白名单将告诉AR接口,其他一切都应该被拒绝

class Brand < ActiveRecord::Base
  attr_accessible :name
end

这将导致一个
ActiveModel::MassAssignmentSecurity::Error
而不仅仅是输出到日志中的警告。

更改后,我仍然会收到“无法批量分配受保护的属性:品牌”错误car需要有一个属性可访问:品牌属性,因为表单助手应该输出参数[:car][:品牌属性]对于提交的一个或多个品牌,它将是散列或数组。控制器也不应该使用brands.build,因为ANAF就是这么做的。控制器应该是普通的创建/更新属性,我有一个品牌控制器。我已经更新了这个问题来展示它。如果你有这个问题,那为什么还要为它的嵌套表单而烦恼呢?看起来你已经有了一个嵌套的资源,这是确保创建的品牌和汽车之间的链接所真正需要的,我会放弃表单/模型嵌套,只使用(@Brand)的表单_就可以了。
class Car < ActiveRecord::Base
  has_many :brands
  accepts_nested_attributes_for :brands
  attr_accessible :brand_attributes
end
class Brand < ActiveRecord::Base
  attr_accessible :name
end
config.active_record.mass_assignment_sanitizer = :strict