2012-06-13 1 views
1

Я пытаюсь установить поле объекта в форме с помощью accept_nested_attributes. Однако в контроллере, когда я делаю:неизвестный атрибут X, но X не находится в аргументе update_attributes в rails3

@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 
+0

Возможно, вы захотите проверить маршрут для отсутствующего столбца: device_id. AR ожидает, что сможет установить это с помощью 'accepts_nested_attributes_for: routes', чтобы удовлетворить' own_to: device' – CMW

+0

Вот и все! Такая легкая ошибка .. Большое спасибо !!! – Ryo

+0

Я превращу это в полный ответ, чтобы вы могли пометить его как решенный. – CMW

ответ

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") %> 
+0

Это f.select, а именно: =) – blushrt

+0

Благодарим за отзыв, но не сработали. Я изменил как @device = Device.find (params [: device] [: id]) в do_compose действие одновременно и получаю ту же ошибку. – Ryo

+0

Кстати, некоторые атрибуты объекта Device во время выполнения " @device = Device.find (params [: id]) "уже установлены. И я пытаюсь установить остальные атрибуты на @ device.update_attributes (params [: device]). – Ryo

0
ActiveRecord::UnknownAttributeError 
"unknown attribute: device_id" 

похоже, что это из-за отсутствия столбца на маршрутах.

ActiveRecord рассчитывает, что у этого можно установить accepts_nested_attributes_for :routes, чтобы удовлетворить belongs_to :device.