belongs_to关联错误

时间:2014-11-13 16:39:19

标签: ruby-on-rails-4 model-associations

我一直在努力创建belongs_to展位的项目。我已声明如下:

class Item < ActiveRecord::Base
  belongs_to :booth 
  belongs_to :category 
end

class Booth < ActiveRecord::Base
  belongs_to :user
  has_many :items 

  validates :user_id, presence: true
  validates :name, presence: true, uniqueness: { case_sensitive: false }, length: {maximum: 25}
end

根据ror文档,这个构建方法应该可以工作,因为项目属于booth:

class ItemsController < ApplicationController

 def create
      @item = booth.build_item(item_params)

      if @item.save
        flash[:notice] = "Successfully created product."
        redirect_to @item
      else
        render :action => 'new'
      end
    end

但是,错误消息显示booth是未定义的变量或方法。协会不应该定义方法吗?我还尝试了booth.items.build和许多其他版本,但都未能识别出这种关联。我认为即使多次阅读文档后我也没有从根本上理解这一点。有人可以帮忙吗?非常感谢。

1 个答案:

答案 0 :(得分:1)

def create
  @item = booth.build_item(item_params)

假设此方法在控制器中,问题是booth未在任何地方定义。看起来这是在ItemsController中(你的问题在这方面可能更具体),那么booth应该是什么?

您的代码似乎假设booth是Booth的一个实例,在这种情况下booth.build_item会初始化与之关联的Item对象,但它并不起作用,因为您需要这样做。从未向booth分配任何内容。

我认为,你的困惑在于模型和控制器之间的区别。例如,如果你在Item模型中有这个:

class Item < ActiveRecord::Base
  belongs_to :booth

  def get_booth_name
    booth.present? && booth.name # (1)
  end
end

# (2)
item = Item.find(123)
puts item.booth          # => #<Booth id: 456, name: "My booth!">
puts item.get_booth_name # => My booth!

...(1)和(2)都有效,因为在两种情况下booth都是实例方法Item#booth,它由belongs_to :booth关联定义。

但是ItemsController对Booth并不了解,也没有ItemsController#booth方法。 ItemsController对Item没有多少了解。

class ItemsController < ActionController::Base
  def some_method
    puts booth.name # (1) => NameError: undefined local variable or method `booth'...
  end

  def another_method
    # (2)
    item = Item.find(123)
    puts item.booth          # => #<Booth id: 456, name: "My booth!">
    puts item.get_booth_name # => My booth!

    # (3)
    booth = Booth.find(456)
    puts booth == item.booth  # => true
  end
end

这一次,(1)引发错误,因为booth不是ItemsController中存在的方法。但是,(2)将起作用,因为Item的实例具有booth方法。 (3)也有效,因为我们从数据库中检索了Booth并将其分配给变量booth

(我假设,在这两个示例中,存在id 123的项目,并且它与具有id 456的展位相关联。)< / p>