QA@IT
«質問へ戻る

質問を投稿

ruby1.9+rails3.2で親子関係をもったテーブルを作りたい

初めまして。ruby初心者です。

以下の2つのテーブルをひも付けたいと考えていますが、子テーブルに親のIDが参照できず困っています。
皆様のお力を貸してくださいm(_ _)m
・お店(親)
・メニュー(子)

お店は複数のメニューを持つことができる。(1対多の関係)
お店の詳細ページがあり、そこに「メニュー作成」リンクを実装。
「メニュー作成」をクリックすると新規作成ページに遷移。

■テーブル定義は以下とします。
shopsテーブル(親)
 id:integer #主キー:ID
 name:string #お店の名前

menusテーブル(子)
 id:integer #主キー:ID
 shop_id:integer #外部キー:shopsテーブルのID
 name:string #メニュー名称
 price:integer #価格

■shopとmenuを関連づけ
shopのモデルに以下を追記
 has_many :menus, dependent: :destroy
menuのモデルに以下を追記
 belongs_to :shop

■shopのviewに以下のリンクを張ります。(show.html.erb)
<%= link_to 'メニュー作成', new_menu_path(shop_id: @shop) %>

■menuコントローラーの修正
menu_controller.rb
def create
@menu = Menu.new(shop_id: @shop.id)
@menu.shop_id = @shop.id

respond_to do |format|
  if @menu.save
    redirect_to @menu, notice: "メニュー作成完了"
  else
    render action: "new"
  end
end

end

これでメニューを作成すると以下のエラーが表示されてしまいます。
shopのidが参照されていないみたいなのですが、どのようにテーブルに反映させたら良いかがわかりません。
Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id

初心者で相当基本的な質問で申し訳ないですが、何卒よろしくお願い致します。

初めまして。ruby初心者です。

以下の2つのテーブルをひも付けたいと考えていますが、子テーブルに親のIDが参照できず困っています。
皆様のお力を貸してくださいm(_ _)m
・お店(親)
・メニュー(子)

お店は複数のメニューを持つことができる。(1対多の関係)
お店の詳細ページがあり、そこに「メニュー作成」リンクを実装。
「メニュー作成」をクリックすると新規作成ページに遷移。

■テーブル定義は以下とします。
shopsテーブル(親)
 id:integer  #主キー:ID
 name:string  #お店の名前

menusテーブル(子)
 id:integer  #主キー:ID
 shop_id:integer  #外部キー:shopsテーブルのID
 name:string  #メニュー名称
 price:integer  #価格

■shopとmenuを関連づけ
shopのモデルに以下を追記
 has_many :menus, dependent: :destroy
menuのモデルに以下を追記
 belongs_to :shop

■shopのviewに以下のリンクを張ります。(show.html.erb)
<%= link_to 'メニュー作成', new_menu_path(shop_id: @shop) %>

■menuコントローラーの修正
menu_controller.rb
  def create
    @menu = Menu.new(shop_id: @shop.id)
    @menu.shop_id = @shop.id

    respond_to do |format|
      if @menu.save
        redirect_to @menu, notice: "メニュー作成完了"
      else
        render action: "new"
      end
    end
  end

これでメニューを作成すると以下のエラーが表示されてしまいます。
shopのidが参照されていないみたいなのですが、どのようにテーブルに反映させたら良いかがわかりません。
Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id

初心者で相当基本的な質問で申し訳ないですが、何卒よろしくお願い致します。