Ruby on rails 3 试图以相同形式保存嵌套属性的未定义方法“id”

Ruby on rails 3 试图以相同形式保存嵌套属性的未定义方法“id”,ruby-on-rails-3,mongoid,nested-attributes,Ruby On Rails 3,Mongoid,Nested Attributes,我正在用Rails开发一个web应用程序,其中我需要用相同的表单保存两个模型。其中一个模型特性属于其他功能,因此我决定对包含的模型使用accepts\u nested\u attributes\u。在视图中,我使用form_保存父模型特征,并使用另一个form_保存包含的模型设施。但是,我总是得到相同的错误: Started PUT "/facilities/537f8adfb4f2d7c124000056" for 127.0.0.1 at 2014-05-31 20:00:23 +0200

我正在用Rails开发一个web应用程序,其中我需要用相同的表单保存两个模型。其中一个模型特性属于其他功能,因此我决定对包含的模型使用accepts\u nested\u attributes\u。在视图中,我使用form_保存父模型特征,并使用另一个form_保存包含的模型设施。但是,我总是得到相同的错误:

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)
app/models/characteristic.rb

app/controllers/facilities\u controller.rb

已解决:


在嵌套属性中,我手动输入字段的名称,因为我使用的是另一个表单_。在这个名称中,我使用facility[characteristics][[name\u of_field],但是当我们需要使用嵌套属性时,我们必须放置characteristics\u属性,因此正确的名称是facility[characteristics\u attributes][[name\u of_field]。

我发现在视图和控制器中使用facility而不是facility。
我假设问题在于FacilitiesController中的load_和Authorization_资源试图从参数中加载@facility提取id。因此,将设施从路径设施更改为设施_path@facility或者类似的东西。

完整的回溯会很有帮助。我已经把完整的回溯放在了一起。谢谢。在视图中,我使用了很多partials。为了简化问题中的代码,我只放了视图的主代码,而忘记了使用@facilities。模型是设施,而不是设施。谢谢
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
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
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
= 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"