🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 5

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

Ruby

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

Q&A

解決済

1回答

542閲覧

RailsでJquery経由のJSONデータをもとにDBを更新したい

summerboot

総合スコア18

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2019/09/24 02:47

Ruby on Rails5 で、セレクトボタンを変更した際に変更した値をDBに反映するプログラムを作りたいと思っています。

ajaxやjsonを利用して反映させるプログラムはJavaで作ったことがあったので、同じように作ろうと思ったのですが、Railsの知識不足からコントローラーにどう記述したらよいのか分かりません。

正直まだRailsを始めたばかりの超初心者で、自動的に生成されてしまう記述の意味などが全然理解できていないところがあります。
知恵を貸していただけたら幸いです。よろしくお願いいたします。

・sampleTableにあるnumberSelectカラムを変更したいプログラム
<view> セレクトボタンを作成して、JS用にクラス指定した

erb

1<%# 使う所だけ抜き出し %> 2<%= form_with(model: sampleTable, local: true) do |form| %> 3 <%= form.select :numberSelect,[[10,10],[9,9],[8,8],[7,7],[6,6],[5,5],[4,4],[3,3],[2,2],[1,1]],{}, :class => 'numberSelect' %> 4 <% end %>

<JS> JSONデータでコントローラーにデータを飛ばす

jquery

1 // セレクトボタンチェンジイベント 2 $(".numberSelect").change(function () { 3 // ajax通信 4 $.ajax({ 5 type: "POST", 6 url: '/change', //URL・コントローラーへの接続自体は確認済 7 data: { "numberSelect": $(this).val() }, //thisvalの取得は確認済 8 dataType: 'json' 9 //成功時 10 }).done(function (data) { 11 alert("成功"); 12 }) 13 // 失敗時 14 .fail(function () { 15 alert("失敗"); 16 }); 17});

<routs.rb>

ruby

1 post 'change', to: 'sampleTable#change' #確認済

<controller> 受け取ったJSONファイルでDBを更新

ruby

1 def change #メソッドへの到達は確認済 2 #ここの書き方が間違っていそうだけど、どう書いたらいいか分からない 3 if @sampleTable.update(numberSelect: data["numberSelect"]) 4 render json: @sampleTable; #これはif文に挟まなければ帰ってくるのを確認 5 end 6 end 7end

現状の実行結果:「失敗」という文字のアラート

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

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

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

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

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

guest

回答1

0

ベストアンサー

rb

if @sampleTable.update(numberSelect: data["numberSelect"])

とありますが、`data["numberSelect"]`の部分は値を取得できていますか? `data`ではなく`params`から取得するべき箇所かなと思いますが...。

投稿2019/09/24 02:59

Mugheart

総合スコア2349

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

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

summerboot

2019/09/24 03:11

回答ありがとうございます。 p params[:numberSelect] で目当ての値がコンソールに出力され、コントローラーに飛んでいることを確認することが出来ました。 ただ、if @sampleTable.update(numberSelect: params[:numberSelect])ではやはり更新に失敗してしまいました……。 これは更新するレコードを認識出来てないという事なのでしょうか?
Mugheart

2019/09/24 03:16

@sampleTable はどこで用意されていますか?
summerboot

2019/09/24 03:48

質問の意味を正しく理解できているか不安なので違ったらすみません。 セレクトボタン自体が<% @sampleTables.each do |sampleTable| %><% end %>の間に挟まっていて、もともとのセレクトボタン上ではそこでレコードを認識していました。 ただjQueryからデータを飛ばす方法に変えてしまったが故にレコードを認識する方法を失ってしまったのでは?と感じました。 なので質問の答えは「用意できていなかった」になるのではないかと思います……。 そうなると、この場合どうやってこの仕組みを用意すればよいのでしょうか。
summerboot

2019/09/24 04:01

一応セレクトボタンのid要素に、レコードに自動採番されるIDを取得する所までは今作る事が出来ました。 ここからjquery→コントローラーまで値を飛ばす事は出来ると思うのですが、この番号を利用してレコードの指定はできるのでしょうか。
Mugheart

2019/09/24 04:07

Railsはリクエストごとにコントローラのインスタンスが生成されます。 なのでインスタンス変数はその都度用意する必要があります。 今回の @sampleTable はレコードが入るインスタンス変数だと思いますが、 change メソッド内、もしくは before_action でそれを用意する必要があります。 もしそれができていない場合 @sampleTable.update(...) は nil.update(...) をしているのと同じです。 nil.update(...) は NoMethodError を起こすので失敗します。
summerboot

2019/09/25 01:35

やはりそういう事ですよね…… セレクトボタンにID属性をつけてJSONでコントローラーまで飛ばし、@sampleTable = SampleTable.find(params[:recordid])でレコードを発見、更新作業が動いていることを確認することが出来ました。 長々と相談に乗って頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問