我正在使用Rails开发一个Web应用程序,其中我需要保存两个具有相同表单的模型。其中一个模型(特性)属于另一个(设施),所以我决定对包含的模型使用accepts_nested_attributes_for。在视图中,我使用form_for来保存父模型(特征),并使用另一个form_for来包含模型(设施)。但是,我总是得到同样的错误:
Started PUT "/facilities/537f8adfb4f2d7c124000056" for 127.0.0.1 at 2014-05-31 20:00:23 +0200
Processing by FacilitiesController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"xr+cGlb9onx4o13IaS3K5UfYzmrb6pMdKljBc8byKdY=", "facilities"=>{"description"=>"Services", "characteristics"=>[{"id"=>"537f8adfb4f2d7c124000057", "title"=>"Room", "description"=>"Free"}]}, "commit"=>"Send", "id"=>"537f8adfb4f2d7c124000056"}
MOPED: 127.0.0.1:27017 COMMAND database=admin command={:ismaster=>1} (1.2872ms)
MOPED: 127.0.0.1:27017 QUERY database=hotel_abadi_development collection=facilities selector={"_id"=>"537f8adfb4f2d7c124000056"} flags=[:slave_ok] limit=0 skip=0 batch_size=nil fields=nil (0.4916ms)
MOPED: 127.0.0.1:27017 QUERY database=hotel_abadi_development collection=admins selector={"$query"=>{"_id"=>"537f8ad9b4f2d7c124000001"}, "$orderby"=>{:_id=>1}} flags=[:slave_ok] limit=-1 skip=0 batch_size=nil fields=nil (0.7987ms)
MOPED: 127.0.0.1:27017 QUERY database=hotel_abadi_development collection=admins selector={"$query"=>{"_id"=>"537f8ad9b4f2d7c124000001"}, "$orderby"=>{:_id=>1}} flags=[:slave_ok] limit=-1 skip=0 batch_size=nil fields=nil (0.7885ms)
MOPED: 127.0.0.1:27017 QUERY database=hotel_abadi_development collection=facilities selector={"$query"=>{"admin_id"=>"537f8ad9b4f2d7c124000001"}, "$orderby"=>{:_id=>1}} flags=[:slave_ok] limit=-1 skip=0 batch_size=nil fields=nil (0.8206ms)
Completed 500 Internal Server Error in 502.0ms
NoMethodError (undefined method `id' for #<ActiveSupport::HashWithIndifferentAccess:0xa6ae334>):
app/controllers/facilities_controller.rb:21:in `update'
Rendered /home/jesus/.rvm/gems/ruby-2.0.0-p353/gems/actionpack-3.2.15/lib/action_dispatch/middleware/templates/rescues/_trace.erb (2.5ms)
Rendered /home/jesus/.rvm/gems/ruby-2.0.0-p353/gems/actionpack-3.2.15/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (2.4ms)
Rendered /home/jesus/.rvm/gems/ruby-2.0.0-p353/gems/actionpack-3.2.15/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (17.7ms)
为了解决这个问题,我还尝试使用带有嵌套属性的fields_for,但是我得到了同样的错误。定义应用程序的主要文件是下一个:
应用/模型/ facilities.rb
class Facilities
...
field :description, type: String
field :language, type: Symbol, default: :es
has_many :characteristics, dependent: :destroy
accepts_nested_attributes_for :characteristics, allow_destroy: true
...
end
应用/模型/ characteristic.rb
class Characteristic
...
field :title, type: String
field :description, type: String
field :language, type: Symbol, default: :es
belongs_to :admin
has_one :upload, dependent: :destroy
accepts_nested_attributes_for :upload, allow_destroy: true
...
end
应用/控制器/ facilities_controller.rb
class FacilitiesController < ApplicationController
load_and_authorize_resource
respond_to :json, :html
...
def update
@facilities.update_attributes!( params[:facilities] )
respond_with @facilities, api_template: :general, location: hotel_path
end
...
end
应用/视图/ facilities.html.haml
= form_for facilities, url: facilities_path( facilities ) do |f|
= f.text_area :description
.facilities_form
- facilities.characteristics.each_with_index do |char, index|
= form_for characteristic, url: characteristic_path( characteristic ), html: { method: :put } do |d|
= d.hidden_field :id, name: 'facilities[characteristics][][id]'
= d.text_field :title, width: 20, size: 20, name: 'facilities[characteristics][][title]'
= d.text_area :description, width: 20, rows: 4, cols: 22, name: 'facilities[characteristics][][description]'
= f.submit "Send"
解决:
在嵌套属性中,我手动输入字段的名称,因为我正在使用另一个form_for。在这个名称中,我使用“设施[特征] [] [name_of_field]”,但是当我们需要使用嵌套属性时,我们必须输入“characteristics_attributes”,所以正确的名称是“设施[的 characteristics_attributes ] [] [name_of_field]”。
答案 0 :(得分:0)
我发现你在视野和控制器中都使用了设施而不是设施
我认为问题是load_and_authorize_resource
FacilitiesController
尝试从@facility
加载id
params
。因此,请将facilities_path( facilities )
更改为facilities_path(@facility)
或类似内容。