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

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

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

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

Q&A

解決済

1回答

5519閲覧

Rails 編集した後に更新されない update

yakumo02

総合スコア103

Ruby on Rails

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

0グッド

0クリップ

投稿2020/09/26 11:49

編集2020/09/26 14:56

railsでアプリを作っていますがupdateで、編集したものを更新しようとしてもエラーは出ないのですが更新されません
form_withを使用して,new.html.erbではurl指定、edit.html.erbではmodelを指定しているのですが、これがいけないのでしょうか?

edit.html.erb

edit.html.erb

1 2 <div class="contents row"> 3 <%= form_with(model: @tweet,local: true) do |f|%> 4 <p>大会選択</p> 5 <%=f.select :tournament_id, options_for_select( @category_parent_array.map{|c| [c[:name], c[:id]]}),{include_blank: "選択してください"}, { class: "parent_category_box", id: "parent_category"}%> 6 <p>高校A 得点</p> 7 <%= f.select :school_a_score, options_for_select((1..50).to_a) %> 8 <p>高校B 得点</p> 9 <%= f.select :school_b_score, options_for_select((1..50).to_a) %> 10 <%= f.text_field :title_info,placeholder: "サブタイトル",class: "game_record",value: "#{@tweet.title_info}" %> 11 <%= f.text_area :text, cols: 30 ,rows: 10,value: "#{@tweet.text}" %> 12 <%= f.label :image, class: "form-image" do %> 13 <% end %> 14 <%=f.submit value: "SENT",class: "game_record"%>

作成時のフォーム new.html.erbのform_withは以下です

<%= form_with url: tweets_path,local: true do |f| %>

コントローラー

def edit @tweet = Tweet.find(params[:id]) end def update @tweet.update(tweet_params) if @tweet.user_id == current_user.id || current_user.admin redirect_to action: :show end def tweet_params params.permit(:image,:text,:title_info,:school_a_score,:school_b_score,:school_a_id,:school_b_id,:tournament_id).merge(user_id: current_user.id) end //:school_a_id :school_b_id :tournamentは他モデルとアソシエーションを組んで参照しています //:school_a_id :school_b_idはjsファイルから送信しています

ためにしeditページをform_tagで書き換えてみると更新できました
edit.html.erbが違うのかと思います

追記 参考

school_a_id
school_b_id
のviewは以下になります

childSelectHtml = `<p>高校A</p> <select name="school_a_id" class="tournament_select_child" id="children_category"> <option value="" data-category="" >選択してください</option> ${insertHTML}</select>` $(".school").append(childSelectHtml) childSelectHtml2 = `<p>高校B</p> <select name="school_b_id" class="tournament_select_child" id="children_category"> <option value="" data-category="" >選択してください</option> ${insertHTML}</select>` $(".school2").append(childSelectHtml2)

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

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

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

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

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

guest

回答1

0

ベストアンサー

お察しの通り、newのときと指定の仕方が違うのが原因かと思います。
もし原因が合っていれば、tweet_paramsをこのように書き換えると、おそらくupdateはうまくいくようになって新規作成は失敗するようになります。
試してみてください。

ruby

1 def tweet_params 2 params.require(:tweet).permit(:image,:text,:title_info,:school_a_score,:school_b_score,:school_a_id,:school_b_id,:tournament_id).merge(user_id: current_user.id) 3 end

追記

form_withにURLを渡す方法とオブジェクト(@tweet)を渡す方法では、データ送信した際にコントローラーに渡るデータの構造に違いがあることが原因です。
このため、新規作成も動くようにするには、updateと同じ方法でform_withを利用すればOKです。

コントローラ

ruby

1def new 2 @tweet = Tweet.new 3end

new.html.erb

<%= form_with model: @tweet, local: true do |f| %>

投稿2020/09/26 13:31

編集2020/09/26 14:12
my_oji

総合スコア39

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

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

yakumo02

2020/09/26 13:41

回答ありがとうございます おっしゃる通りupdateはうまくいきましたが、作成がrequireで引っかかってしまいます 他テーブルの値を参照しているパラメーターがあるからでしょうか? 両方できる方法はございますでしょうか?
my_oji

2020/09/26 13:43

ありますよー。回答追記しますね。
yakumo02

2020/09/26 14:08

すみません、param is missing or the value is empty: tweetが発生してしまいました 申し訳ありませんが、原因が考えられるファイルなどはございますでしょうか?
my_oji

2020/09/26 14:13

おっと、new.html.erbのコードを間違えていました。修正したのでこちらで再度お試しください
yakumo02

2020/09/26 14:26

ありがとうございます! さらに申し訳ありませんが、他モデルを参照しているschool_a_id :school_b_idがnilになってしまったのですが、requireは関係ないでしょうか?
yakumo02

2020/09/26 14:48 編集

ありがとうございます 変更する予定のものです 拝見してみます
yakumo02

2020/09/26 15:34

質問に追記しましたが、selectを使っておりhiddenが使えない状況です nameがコントローラーにわたる値だと認識していますが、コントローラーはいじらずname付近を変えた方が良いのでしょうか
my_oji

2020/09/26 21:46

変更できるようにする場合は、hiddenは適さないですね。了解です。 nameが合わなくなってしまっていますね。name="tweet[school_a_id]"とすると、値が渡せるようになると思います。 from_with model: @tweetの形で作ったフォームのインプットは、nameが’モデル名[アトリビュート名]'という形になります。 うまく行ったらschool_b_idのっ方も同じように変えてみてください。 ちなみに、yakumoさんがやろうとしていることは結構難易度高めで、railsとjsの連携周りでいろいろとハマりポイントがあります。応援しています????
yakumo02

2020/09/27 00:15

ありがとうございます!実装できました 色々とお付き合いいただき、ありがうございました! なるほど、やはり連携は難しいのですね 応援ありがとうございます、これからもがんばります!
my_oji

2020/09/27 00:21

原因の推測は概ね合っていたのでセンスあると思います???? 頑張ってください????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問