我在我的应用程序中生成了两个模型tour和tourcategories。现在,我想使用x /400bx $esp
和has_many
关联这两个模型。游览可以与单个旅游类别相关,但旅游类别可以有多个游览。因此,belongs_to
模型的定义如下:
tour
这是tourcategory模型的定义:
class Tour < ActiveRecord::Base
belongs_to :tourcategory
attr_accessible :content, :element_id, :job_id, :title, :priority, :tourcategory
end
这是旅游迁移文件的定义:
班class Tourcategory < ActiveRecord::Base
has_many :tours
attr_accessible :title
end
CreateTours < ActiveRecord::Migration
这是旅行控制器的定义:
def change
create_table :tours do |t|
t.string :element_id
t.string :title
t.text :content
t.integer :job_id
t.integer :priority
t.belongs_to :tourcategory, index:true
t.timestamps
end
end
end
现在我收到错误
def new
@tourcategories = Tourcategory.all
@tour = Tour.new
@tour.build_tour
respond_to do |format|
format.html
format.json { render json: @tour }
end
end
当我访问undefined method `tourcategories'
视图进行编辑和添加新游览时。
这是遇到错误的代码。
_form.html.haml
答案 0 :(得分:0)
你定义了,
Tourcategory有多个旅游团。 has_many :tours
游览属于一个Tourcategory。 belongs_to :tourcategory
因此,您无法从tourcategories
致电@tour
。您可以从tourcategory
@tour
Additionaly,
@tour.build_tour
&lt; - 可能会犯错误。
您可以使用build_*
方法获得belongs_to
关系
我想你应该试试@tour.build_tourcategory
阅读&#34;行动记录协会&#34; Rails指南中的部分:http://guides.rubyonrails.org/association_basics.html
答案 1 :(得分:0)
您无法呼叫@tour.tourcategories
,因为Tour
属于单个Tourcategory
,因此该方法不会由Rails生成。您可以致电@tour.tourcategory
或@tourcategory.tours
。
为什么你要将第四个参数传递给options_for_collection_from_select
? map
方法将返回一个集合,但您需要一个元素。尝试省略它,看它是否有效。
您的代码还有一些问题:
除非您明确定义了该方法,否则 @tour.build_tour
将无法工作(如果您有,则可能更好地将其命名为其他方法)。为build_something
关系生成所有has_one
方法。也许您正在寻找@tourcategory.tours.build
。
您不应该从视图中调用Tourcategory.all
,而是使用您在控制器中定义的@tourcategories
变量。视图不应该直接调用模型。
如果你正在使用Rails 4,你不应该使用attr_accessible
,而是在控制器中定义强参数。
希望有所帮助。
答案 2 :(得分:-1)
你实际上需要使用HABTM(拥有和属于许多人) - 请查看Rails documentation了解更多详情