undefined方法`[] ='为nil:NilClass

时间:2013-08-18 08:01:08

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

当我尝试使用嵌套属性提交此表单时,我一直收到此未定义错误,不确定它现在已经挣扎了很长一段时间了,我试图让用户选择一个选项理事会模型提交他们的选择,我不确定我是否正确连接我的关联或错误来自表单。是铁路的菜鸟。提前谢谢。

错误 已更新

Properties::BuildController#update
app/controllers/properties/build_controller.rb, line 21

Started PUT "/properties/5/build/council" for 127.0.0.1 at 2013-08-18 08:52:07 +0100
Processing by Properties::BuildController#update as HTML
  Parameters: {"utf8"=>"✓","authenticity_token"=>"wBWQaxtBioqzGLkhUrstqS+cFD/xvEutXnJ0jWNtSa0=",  "council_id"=>"1", "commit"=>"Save changes", "property_id"=>"5", "id"=>"council"}
  Property Load (0.2ms)  SELECT "properties".* FROM "properties" WHERE "properties"."id" =  ? LIMIT 1  [["id", "5"]]
Completed 500 Internal Server Error in 35ms

NoMethodError - undefined method `[]=' for nil:NilClass:

市议会观点

<h1>Select Council</h1>


<%= form_tag  url_for(:action => 'update', :controller =>   'properties/build'), :method  => 'put' do %>

<%= select_tag :council_id, options_from_collection_for_select(Council.all, :id, :name) %>

    <%= submit_tag  %>
<% end %>

控制器

class Properties::BuildController < ApplicationController
  include Wicked::Wizard

   steps :tenant, :meter, :council, :confirmed 

  def show
    @property = Property.find(params[:property_id])
    @tenants = @property.tenants.new(params[:tenant_id])
    @meter = @property.build_meter
    @council = @property.build_council
    render_wizard
  end

  def edit
    @property = Property.find(params[:property_id])
  end


  def update
    @property = Property.find(params[:property_id])
    params[:property][:status] = step.to_s
    params[:property][:status] = 'active' if step == steps.last
    @property.update_attributes(params[:property])
    render_wizard @property
  end

end

Council.rb

class Council < ActiveRecord::Base
  attr_accessible :CouncilEmail, :name, :CouncilTel

  belongs_to :property
end

更新 Propery.rb

class Property < ActiveRecord::Base
  attr_accessible  :name, :address_attributes, :tenants_attributes, :meter_attributes, :council_attributes, :property_id, :status
  belongs_to :user 


  has_one :address, :as => :addressable
  accepts_nested_attributes_for :address, :allow_destroy => true


  has_one :council
  accepts_nested_attributes_for :council, :allow_destroy => true

  has_many :tenants, :inverse_of => :property
  accepts_nested_attributes_for :tenants, :allow_destroy => true, :reject_if     => :all_blank

  has_one :meter
  accepts_nested_attributes_for :meter, :allow_destroy => true


  validates :name,      :presence => :true
  validates :address,   :presence => :true
  validates :tenants,   :presence => true, :if => :active_or_tenants?
  validates :council,   :presence => true, :if => :active_or_council?


  def active?
    status == 'active'
  end

  def active_or_tenants?
    (status || '').include?('tenants') || active?
  end

  def active_or_council?
    (status || '').include?('council') || active?
  end
end

3 个答案:

答案 0 :(得分:5)

我想这个

params[:property]

nil。所以Ruby在做

时抱怨
params[:property][:status] = 'foo'

您可能想要这样做:

if params[:property]
  params[:property][:status] = 'foo'
end

但是,在您的情况下,问题是因为您使用的是form_tag而不是form_for,因此未定义params[:property]

答案 1 :(得分:1)

现在检查ruby哈希中嵌套属性的更好方法是使用dig

示例:

params.dig(:property, :status)

如果未定义密钥,则返回nil。

答案 2 :(得分:0)

如果使用数据文件,请确保 - 中没有杂散的 data.ymlSee this GitHub comment