Я пытаюсь установить поле объекта в форме с помощью 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
Возможно, вы захотите проверить маршрут для отсутствующего столбца: device_id. AR ожидает, что сможет установить это с помощью 'accepts_nested_attributes_for: routes', чтобы удовлетворить' own_to: device' – CMW
Вот и все! Такая легкая ошибка .. Большое спасибо !!! – Ryo
Я превращу это в полный ответ, чтобы вы могли пометить его как решенный. – CMW