1

我正在尝试使用 accept_nested_attributes 在表单中设置对象的字段。但是,当我这样做时,在控制器中:

@device.update_attributes(params[:device])

我得到:

ActiveRecord::UnknownAttributeError
"unknown attribute: device_id" 

但是 device_id 是其他非相关模型的属性,不包含在 params 中。参数如下所示。

{"utf8"=>"✓",
 "authenticity_token"=>"Xja5GCNRutpZn2c4wKeSx0KO6sNEzh09kWmPQ0/0Hys=",
 "id"=>"5",
 "device"=>{"routes_attributes"=>{"0"=>{"name"=>"",
 "origin_attributes"=>{"name"=>"",
 "lat"=>"",
 "lng"=>""},
 "destination_attributes"=>{"name"=>"",
 "lat"=>"",
 "lng"=>""}}}},
 "commit"=>"Create Device"}

可以认为是什么原因。这是我的代码。

看法

<%= form_for @device, :url => {:action => "do_compose"}, :method => :post do |f| %>
  <div class="field">
     <%= select_tag(:id, options_for_select( Device.all.collect{|d| [d.name + "/" + d.get_driver().name, d.id] } ),:prompt=>"select a device") %>                                 
  </div>

  <div class="field">
    <%= render partial:"routes/nested_routes_form", locals: {route_object:@device.get_route(), parent_form:f} %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

控制器

  def do_compose
    @device = Device.find(params[:id])
    respond_to do |format|
      if @device.update_attributes(params[:device])
        format.html { redirect_to @device, notice: 'Device was successfully updated.' }
      else
        format.html { render action: comopse }
      end
    end
  end

模型

  class Route < ActiveRecord::Base
    attr_accessible :name, :destination_attributes, :origin_attributes, :waypoints, :driver_id
    has_many :waypoints
    has_one :origin, :class_name=>"Origin"
    has_one :destination, :class_name=>"Destination"
    belongs_to :device
    accepts_nested_attributes_for :origin, :destination, :waypoints
  end

  class Device < ActiveRecord::Base
    attr_accessible :id, :name, :password
    attr_accessible :device_driver_bind_attributes, :drivers_attributes, :routes_attributes, :current_location_attributes
    has_many :drivers, through: :device_driver_bind
    has_many :device_driver_bind, dependent: :destroy
    has_one :current_location, :class_name => "CurrentLocation"
    has_many :routes
    has_many :origins, through: :routes
    has_many :destinations, through: :routes
    has_many :waypoints, through: :routes
    accepts_nested_attributes_for :routes, :current_location, :device_driver_bind
  end 
4

2 回答 2

0

这必须是您的 select_tag 中的问题,试试这个:

<%= f.select(:id, options_for_select( Device.all.collect{|d| [d.name + "/" + d.get_driver().name, d.id] } ),:prompt=>"select a device") %>  
于 2012-06-13T05:26:14.833 回答
0
ActiveRecord::UnknownAttributeError
"unknown attribute: device_id"

看起来这是由于 Routes 上缺少一列。

ActiveRecord 期望能够将其设置为accepts_nested_attributes_for :routes, 以满足belongs_to :device.

于 2012-06-18T13:57:29.473 回答