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

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

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

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

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

1回答

928閲覧

accepts_nested_attributes_forを使用し、保存する際に失敗しrollbackしてしまう

2019

総合スコア9

Ruby on Rails 5

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

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

1クリップ

投稿2020/02/04 12:11

編集2020/02/04 12:15
前提・実現したいこと

tweetテーブルとtagテーブルをアソシエーションしており、tweetを保存する際に、
tagのカラム(tag_name)を一緒に保存したく、accepts_nested_attributes_forを使用してます。

以下のエラーコードを確認すると、paramsには、tag_nameが入っているが、
"tag_attributes"=>{"tag_name"=>"testtest"}
その後、ROLLBACKしてしまっており、保存出来ていない。
※tweetテーブルのみを保存する際は、正しく出来ておりました。
ご指摘頂けないでしょうか。
※一つのtweetには、一つのtagしか付かない事とする。

該当ソースコード

<各model>

<tweet.rb> belongs_to :tag accepts_nested_attributes_for :tag <tag.rb> has_many :tweets

<tweets_controller>

 def new @tweet = Tweet.new @tweet.build_tag end def create #binding.pry Tweet.create(tweet_params) end private def tweet_params params.require(:tweet).permit(:image, :text, :time, tag_attributes: [:tag_name]).merge(user_id: current_user.id) end

<tweet/new.html.haml>

= form_with(model: @tweet, local: true) do |form| = form.number_field :time, placeholder: "Time" = form.fields_for :tag do |tag_form| = tag_form.text_field :tag_name, placeholder: "tag" = form.text_field :image, placeholder: "Image Url" = form.text_area :text, placeholder: "comment" = form.submit "SEND"

<エラーコード>

Started POST "/tweets" for ::1 at 2020-02-04 20:35:37 +0900 Processing by TweetsController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"SW8hLHlout0cFZUagb/==", "tweet"=>{"time"=>"2", "tag_attributes"=>{"tag_name"=>"testtest"}, "image"=>"https://images/Rails1-4/sample.jpg", "text"=>"test222"}, "commit"=>"SEND"} User Load (0.9ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 ORDER BY `users`.`id` ASC LIMIT 1 ↳ app/controllers/tweets_controller.rb:50 (1.0ms) BEGIN ↳ app/controllers/tweets_controller.rb:17 User Load (3.9ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1 ↳ app/controllers/tweets_controller.rb:17 (4.3ms) ROLLBACK ↳ app/controllers/tweets_controller.rb:17 Rendering tweets/create.html.haml within layouts/application Rendered tweets/create.html.haml within layouts/application (3.5ms) Completed 200 OK in 185ms (Views: 133.6ms | ActiveRecord: 10.0ms)

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

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

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

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

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

winterboum

2020/02/04 23:34

tweets_controller.rb の 17行、50行はどこに当たりますか?
2019

2020/02/05 01:26 編集

17行目はcreateアクションの Tweet.create(tweet_params)  ←ココ になります。 50行目は、質問文に含まれてませんでしたが、 move_to_indexで定義している before_action :move_to_index, except: [:index, :show, :search] 〜省略〜  def move_to_index   redirect_to action: :index unless user_signed_in?   ←ココ   end になります。
winterboum

2020/02/05 01:37

ふむ、、、 codeを見た感じではここだ、というのが見当たらないです。 Tweet.create(tweet_params) を @tweet = Tweet.new(tweet_params) if @tweet.save 成功時の処理 else render action: new end として、new.html に@tweet.errors.full_massage を出すようにしてみてください
2019

2020/02/05 03:27

お時間とらせてしまい、申し訳ございません。  new.html に@tweet.errors.full_massageというのは、以下の①の方法でよろしいでしょうか。 ①@tweet.errors.full_massageの結果   https://gyazo.com/7c96c2d6e118b77bc849b242b69af8d3 ②エラーコード  https://gyazo.com/8e90dcdc45c2f4b6a86ffcd06f7323f2 ③tweets_controller  1~45行目  https://gyazo.com/3c88922ff9520089e4e576e19440b827  44~57行目  https://gyazo.com/4d88abf70368601f19b8e0645cbb2f2a
2019

2020/02/05 05:21

すみません、userテーブルとtagテーブルのアソシエーションをしておりまして、それを消したら、データが保存できる様になりました! 元々、tagテーブルとuserテーブルのカラムに紐づいたtweetテーブルのカラムのデータの表示をさせたく、 データの表示方法も悩んでおり、userとtagテーブルをアソシエーションさせておりました。 また、データの表示方法につきましては、tweetテーブルにuser_idとtag_idをforeign_keyとして持っておき、tweetコントローラでのアクティブレコードの記述を以下の様に変えたら、エラーが出なくなりました。 (これから表示させるためにviewを作ります。) 上記、③tweets_controllerの7行目に記載の 誤 @times = Tweet.sum(:time).group('user_id, tag_id') 正 @times = Tweet.group('user_id, tag_id').sum(:time) (今回のご質問の際には、本箇所が悪さをしない様に、コメントアウトしてましたが、userとtagテーブルのアソシエーションをコメントアウトしておりませんでした、、) 質問文に記載していなかった箇所でのミスでお時間とらせてしまい、 申し訳ございませんでした、、 また、この度は、ご対応頂き大変ありがとうございました!
winterboum

2020/02/05 05:21

画像でなくてテキスト貼り付けにしてほしいなぁ。。 ①だけでは不足でtweet/new.html.hamlに 表示のためのtweet/new.html.hamlにも設定が必要です エラーコードって何をした時のですか?
2019

2020/02/05 05:36

行数を少なくしようと思い、画像にしてましたが失礼致しました。 今後、気をつける様に致します。 エラーコード は、tweet/new.html.hamlのページで 投稿ボタンを押した際のものになります。
winterboum

2020/02/05 05:49

あ、ごめん render action: new ではなく render action: :new だ。 でもnew直さないとエラーメッセージでないよ
2019

2020/02/05 06:43

・render action: :newを修正しました。 ・tweets/new.html.hamlには、  = @tweet.errors.full_messages  を記述しました。(これであってますでしょうか。) ただ、現状、@tweet.saveが正常に処理されておりますので、 root_pathにredirectされております。
winterboum

2020/02/05 06:51

>ただ、現状、@tweet.saveが正常に処理されておりますので とは、期待通りの動きになった? 問題解決?
2019

2020/02/05 07:23

14:21に送信したコメントでその旨お伝えさせていただいておりましたが、 アドバイスのおかげもあって解決致しました!
winterboum

2020/02/05 07:43

よかったです。 解決の内容を自己回答して、解決済にしておいてください
guest

回答1

0

自己解決

userテーブルとtagテーブルをアソシエーションしており、
各モデルに記述したhas_manyとbelongs_toの記述を
削除したら、データが保存できる様になりました。

元々、tagテーブルとuserテーブルのカラムに紐づいたtweetテーブルの
カラムのデータの表示をさせたく、データの表示方法も悩んでおり、
userとtagテーブルをアソシエーションさせておりました。

また、データの表示方法につきましては、tweetテーブルにuser_idとtag_idをforeign_keyとして持っておき、tweetコントローラでのアクティブレコードの記述を
以下の様に変えたら、エラーが出なくなりました。

投稿2020/02/05 07:54

2019

総合スコア9

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問