我一直在努力创建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
和许多其他版本,但都未能识别出这种关联。我认为即使多次阅读文档后我也没有从根本上理解这一点。有人可以帮忙吗?非常感谢。
答案 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>