未定义的方法" id"尝试以相同的形式保存嵌套属性

时间:2014-05-31 18:03:40

标签: ruby-on-rails-3 mongoid nested-attributes

我正在使用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]”。

1 个答案:

答案 0 :(得分:0)

我发现你在视野和控制器中都使用了设施而不是设施 我认为问题是load_and_authorize_resource FacilitiesController尝试从@facility加载id params。因此,请将facilities_path( facilities )更改为facilities_path(@facility)或类似内容。