NoMethodError:未定义的方法`每个&#39; ##menu:0x512be78> </menu:0x512be78>

时间:2014-08-12 10:01:42

标签: ruby-on-rails

irb(main):001:0> hotel=Hotel.find(1)
  ←[1m←[36mHotel Load (1.0ms)←[0m  ←[1mSELECT  `hotels`.* FROM `hotels`  WHERE `hotels`.`hotel_Id` = 1 LIMIT 1←[0m
=> #<Hotel hotel_Id: 1, hotel_Name: "Hotel Swosti", hotel_address: nil, hotel_location: "Bhubaneswar", hotel_contactNo: nil, crea
ted_at: nil, updated_at: nil>

irb(main):002:0> hotel.menus
  ←[1m←[35mMenu Load (1.0ms)←[0m  SELECT `menus`.* FROM `menus`  WHERE `menus`.`hotel_id` = 1
=> #<ActiveRecord::Associations::CollectionProxy []>

irb(main):003:0> first_menu=Menu.new(:menu_item_name=>'Rajma',:price=>30,:item_type=>'Half')
=> #<Menu hotel_Id: nil, menu_item_id: nil, menu_item_name: "Rajma", price: 30, item_type: "Half", created_at: nil, updated_at: n
il>

irb(main):004:0> first_menu.hotel
=> nil

irb(main):005:0> hotel.menus=first_menu
NoMethodError: undefined method `each' for #<Menu:0x512be78>

迁移:     create_table:menus,:id =&gt; false do | t |       t.integer&#39; hotel_Id&#39;       t.primary_key&#39; menu_item_id&#39;       t.string&#39; menu_item_name&#39;       t.integer&#39;价格&#39;       t.string&#39; item_type&#39;

end
add_index("menus","hotel_Id")

端   端

2 个答案:

答案 0 :(得分:4)

如果您要将first_menu添加到hotel.menus关联,则应执行以下操作:

hotel.menus << first_menu

发生错误是因为Hotel#menus= setter期望收集Menu个对象作为参数。

答案 1 :(得分:0)

hotel.menus是一种关系。您使用的关联会返回一系列酒店菜单。

要获得第一个成员,只需一个菜单,您可以使用hotel.menus.first

如果您想为酒店创建一个新菜单,您可能会更好地使用:

hotel.menus.build(menu_item_name: 'Rajma', price: 30, item_type: 'Half')
hotel.save!

create表单 - 取决于您在保存之前要对酒店或菜单执行的操作。