QA@IT

モデルの外部キー保存方法について

2238 PV

リレーションしているItemモデルについて質問です。
商品登録時にログイン中のUserに紐付いたShopは取得出来るのですが、
Shop自体が複数登録出来るので、items#createの段階で@item.shop_idに前画面のshop.idを設定したいです。
どうやればshop.idを渡せるのか検討がつかないので、何卒よろしくお願い致します。

  • 遷移的には下記のとおりです。

    shops#index > items#new > items#create 
    
  • モデルの関係
    全てscaffoldを使用しています。

    User(Deviseを使用) - Shop - Item
    User has many shops
    Shop has many items
    
  • 店舗登録処理

    # POST /shops
    # POST /shops.json
    def create
    @shop = Shop.new(shop_params)
    @shop.user_id = current_user.id # ログイン中のユーザIDを設定
    
    respond_to do |format|
      if @shop.save
        format.html { redirect_to @shop, notice: 'Shop was successfully created.' }
        format.json { render action: 'show', status: :created, location: @shop }
      else
        format.html { render action: 'new' }
        format.json { render json: @shop.errors, status: :unprocessable_entity }
      end
    end
    end
    
  • 商品登録処理

    # POST /items
    # POST /items.json
    def create
    @item = Item.new(item_params)
    @item.shop_id = current_user.shops[0].id # TODO 暫定的に1件目の店舗を指定
    
    respond_to do |format|
      if @item.save
        format.html { redirect_to @item, notice: 'Item was successfully created.' }
        format.json { render action: 'show', status: :created, location: @item }
      else
        format.html { render action: 'new' }
        format.json { render json: @item.errors, status: :unprocessable_entity }
      end
    end
    end
    

環境

  • Ruby 2.0.0-p247
  • Rails 4.0.2

回答

勘違いしてたらごめんなさい。

routes.rb

resources :user do
    resources :shop do
                 resouces: item do
        end
end

と定義してるとします。

ここで、items に PostするURLは
POST /users/1/shops/1/items
になるはずです。

そしてShopのIDを欲しいのであれば、コントローラ内でparams[:shop_id]でとれるはずです。

編集 履歴 (0)
  • lain003さん、回答ありがとうございます!
    ルーティングは後回しにしようと思ったので、このように並べてましたが、やりたいことは仰るとおりです!
    devise_for :users
    resources :shops
    resources :items

    回答を参考にして修正してみます!
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。