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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

813閲覧

【Ajax通信】ストロングパラメーターで特定のキーのみ受け取れない件

shun0211

総合スコア4

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2020/05/25 22:41

投稿画面から非同期でのコメント機能を実装しているところ一点疑問が出ましたので質問させて下さい。
内容がparamsで送られてきているset_list_idがストロングパラメーターで受け取れないという点になります。

送られてきているparams

params => <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"cyWCD/8aCpYmPxgzJeKzH3Nf1WdX1gzMjsNG6X4JSAO8exjLN+GmwIHGdwuzQpm4vcmgYX5UDKVZtUGBeFOR7w==", "comment"=> <ActionController::Parameters {"content"=>"行きたかった!!"} permitted: false>, "controller"=>"comments", "action"=>"create", "id"=>"1", "set_list_id"=>"1"} permitted: false>

@commentの中身

@comment => #<Comment:0x00007fba9eb33980 id: nil, content: "行きたかった!!", user_id: nil, set_list_id: nil, created_at: nil, updated_at: nil>

下に示したviewのform_forによりフォームを作っています。

showhtmlhaml

1.comment__form__box 2 = form_for [@set_list, @comment], url: {controller: 'comments', action: 'create', set_list_id: '1'} do |f| 3 = f.text_field :content, placeholder: "コメントを入力して下さい", class: "comment__form" 4 = f.button type: "submit", class: "comment__post__button" do 5 %i.far.fa-comment

JavaScript側では下のようにフォーム情報をコントローラーに送信しています。

comment.js

1$('#new_comment').on('submit', function(e){ 2 e.preventDefault(); 3 var formData = new FormData(this); 4 var url = $(this).attr('action'); 5 $.ajax({ 6 url: url, 7 type: "POST", 8 data: formData, 9 dataType: "json", 10 processData: false, 11 contentType: false 12 })

最後にこちらがコントローラーの記述になります。

commentscontroller

1def create 2 @comment = Comment.new(comment_params) 3 @comment.user_id = current_user.id 4 @comment.set_list_id = params[:set_list_id] 5 respond_to do |format| 6 if @comment.save 7 format.html { redirect_to :back } 8 format.json 9 end 10 end 11 end 12 13 private 14 def comment_params 15 params.require(:comment).permit(:content, :set_list_id) 16 end

set_list_idがストロングパラメーターで受け取れないので、直接paramsから引っ張ってきていますが、なぜこのようにとってこれているのにストロングパラメーターだと受け取れないのかが気になり、夜も眠れません。
何卒、宜しくおねがいします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

直接paramsから引っ張ってきていますが、なぜこのようにとってこれているのにストロングパラメーターだと受け取れないのかが気になり、夜も眠れません。

キーが正しくありません。

params.require(:comment).permit(:content, :set_list_id)set_list_idを取ってきたい場合、フォームのnamecomment[set_list_id]とする必要がありますが、今のフォームの書き方では、単にset_list_idだけになってしまっています。

投稿2020/05/26 00:25

maisumakun

総合スコア145183

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

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

shun0211

2020/05/26 00:43

昨日に引き続き回答ありがとうございます! フォーム情報のcontent(コメント内容)はマストで必要なので、この場合、nameをそのままにして上で書いているように <code>@comment.set_list_id = params[:set_list_id]</code> として、個別でset_list_idを入れてやるのがベストという理解であっているでしょうか??
maisumakun

2020/05/26 00:49

f.hidden_field :set_list_idのようにフォーム側に埋め込むのが妥当かと思います。 (「フォームのname」は、「set_list_idを送るためのフォーム要素のname」という意味でした)
shun0211

2020/05/26 02:03

f.hidden_fieldを使う方が妥当なんですね 使ってみるとコードがきれいになりました。 丁寧なアドバイスありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問