質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

1回答

297閲覧

railsでcreateが正しく処理されない

chiuney

総合スコア3

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/11/12 01:02

前提

【前提】

  •  色々試した結果下記の様な状態になったので、コード等混乱している可能性が大いにあります。
  •  初学者のため前提から崩れているかもしれません。
  •  主に箇条書きのため敬語を使っていない場面が多々あります。
  •  下記以外に必要情報等ありましたら教えていただけますと幸いです。

【アプリ概要】

  • 各userはお気に入りlistを作成し、list内でshopを登録できる
  • shopはいずれかのlistに属する必要がある
  • 既存のshopをseedsで用意済み
  • listとshopは多対多
  • 既存のshopを任意のlistに登録するために中間テーブル(list_shop)を用意済み

【実現したいこと】

  • shopをlistに登録したい
  • 各shopの詳細画面の「リストを追加」ボタンを押す


追加するlistを選択(複数選択可)

追加完了(shop画面に戻る)

発生している問題・エラーメッセージ

・エラーは発生していない
・createボタンを押してもshopを保存できない

該当のソースコード

new.html.erb(list_shops) <%= form_with model: @list_shop ,url:shop_list_shops_path(shop_id: @shop.id), local: true do |f| %> <div> <div> <%= @shop.shop_name %> </div> <%= f.select :list_ids , List.where(user_id: current_user.id).map { |list| [ list.list_name ] }, {include_hidden: false}, {class: 'form-control',multiple: true} %> <%= hidden_field_tag "list_shop[list_ids][]", session[:list_id] %> <div> <%= f.submit "ショップを追加" %> </div> </div> <% end %>
list_shops_controller def new @shop = Shop.find(params[:shop_id]) @list_shop = ListShop.new end def create @list_shop = ListShop.new @shop = Shop.find(params[:shop_id]) @list_shop = ListShop.create(shop_id: params[:id]) session.delete(:list_id) redirect_to shop_path(@shop.id) end private def shop_params params.require(:list_shops).permit(:shop_name, list_ids: []) end
show.html.erb(shop) <% if ListShop.where(shop_id: @shop.id).exists? %> <%= link_to "リストから削除", shop_destroy_list_shops_path(@shop) , method: :delete, class:"follow-item__follow-btn--unfollow" %> <% else %> <%= link_to 'リストに追加', shop_new_list_shops_path(shop_id: @shop.id) , method: :POST, class:"follow-item__follow-btn--unfollow" %> <% end %> </div>

補足情報

Rails 6.0.3.3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

byebugなどを使ってデバッグして、createメソッドで何が起こっているか確認してください。

diff

1- @list_shop = ListShop.create(shop_id: params[:id]) 2+ @list_shop = ListShop.create!(shop_id: params[:id])

投稿2020/11/12 01:31

no1knows

総合スコア3365

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chiuney

2020/11/12 01:39

返信ありがとうございます。 上記の下にbyebugを記述したのですが、上記の部分で次のエラーが発生しました。 ActiveRecord::RecordInvalid in ListShopsController#create バリデーションに失敗しました: Listを入力してください, Shopを入力してください
no1knows

2020/11/12 02:17

ということで、バリデーションに引っかからないようにコントローラーを修正すれば良いと思いますよ。
chiuney

2020/11/12 03:05

現状バリデーションは設定していないのですが、何に引っかかっているのでしょうか? すみません、何をすれば良いのか全くわかっていない状態です。
no1knows

2020/11/12 03:34

「バリデーションエラーが起きていることがわかった。」 ⇒「バリデーションは設定していない。複雑なことといえば、多対多の中間テーブルを使っているくらいか。。。」 ⇒「rails 多対多 validation エラー」で検索してみよう。
chiuney

2020/11/12 06:26

ありがとうございます。 上記のエラーは出なくなりました。 他のエラーにも対処してコントローラーを以下に変更したところ、 ``` def new @shop = Shop.find(params[:shop_id]) @list_shop = ListShop.new end def create @list_shop = ListShop.create(list_shop_params) session.delete(:list_id) redirect_to request.referer end ``` 以下のエラー ActiveRecord::NotNullViolation in ListShopsController#create SQLite3::ConstraintException: NOT NULL constraint failed: list_shops.list_id が発生し、エラーで検索してもよく理解できませんでした。 どこを見るべきなのでしょうか?
no1knows

2020/11/12 22:43

SQLite3::ConstraintException: NOT NULL constraint failed: list_shops.list_id ⇒「ListShopsControllerのcreateアクションで、SQLite3が、list_shops.list_idがNOT NULL 制約に失敗」 ・・・ということはlist_shops.list_idがnullになっているようだ。 まずは本当にlist_idの値がないのかbyebugで確認してみよう。 パラメータにも値は入っていないかな。。。。 うーん多対多のアソシエーションの設定が間違っていないかもう一度確認してみよう・・・ https://railsguides.jp/association_basics.html#%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91%E3%81%AE%E7%A8%AE%E9%A1%9E
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問