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

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

詳細はこちら
Ruby

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

JSON

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

Ruby on Rails

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

3回答

4107閲覧

paramsで値を取得する際にrequireを必ずしも使わなくもいいものなのでしょうか?

yoshipu

総合スコア115

Ruby

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

JSON

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

Ruby on Rails

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

1クリップ

投稿2019/10/17 14:08

すみません。
簡潔にしたかったのですが、うまく短くできませんでした。

jsonで次をリクエストします。

{ "hoge_id": "fuga" } puts params paramsの中身はこちらです。 結果 #{"hoge_id => "fuga", "controller => users", "action" => "piyo", "user => {}" puts prams.require(:user).permit(:hoge_id) こんな感じで、requireメソッドを使いキーでしぼって、permitメソッドに渡したいのですが、エラーになります。 :userではなく、ほかの値を入れてもエラーになります。 結果 #<Action Controller:ParameterMissging: param is missing or the value is empty: user puts params.permit(:hoge_id) 結局、requireを使わず、permitで許可するキーを指定して、その値だけを使っています。 結果 # "hoge_id => "fuga" **paramsで値を取得する際にrequireを必ずしも使わなくもいいものなのでしょうか?** 僕の解釈では、キーを指定してそれ以外を受け取らないようにする目的だと思うのでいらないのではないかと思いました。 その代わり、permitでしっかりと受け取りたいものを指定しています。 試しに、users_controllerの中で{"name": "太郎"}をjsonでPOSTしてputs prams.require(:user).permit(:name)のようにするとuser => {"name": "太郎"}とちゃんとuserキーの中に値が格納されます。nameはusersテーブルにもともとあるカラムです。 hoge_idはusersテーブルにもともとないものなのでそこが異なっていると思うのですが、よくわかりませんでした。

このように、userをキーとしてjsonでリクエストすると、requireが使えるので、このように、jsonで送るのが正で、userキーをつけないのはよくないかもしれませんが、要望でuserキーを使わないことになっています。

{ "user": { "hoge_id": "fuga" } }

サンプルをネットで探しましたが、params.require(:user).permit(:name)のようなフォーマットしかなく、RailsGuideには

params.permit(:name)

のようにparamsから直接permitを呼んでいるものもあるのですが、これがよい使い方なのかがわかりませんでした。

ActionController::Parameters

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

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

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

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

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

guest

回答3

0

ベストアンサー

Rails4でStrong Parameterに出くわした時に色々やったときの経験では、

DBに入れるには permitは必要。permitしない項目は無視される。
requireは不要、params[:users]でよい。

でした。
ですのでそれに照らすと

{ "hoge_id": "fuga" }

で user.update(hoge_id: 某) とするには
user.update(hoge_id: params.permit(:hoge_id))
で良いかと。

投稿2019/10/17 23:54

winterboum

総合スコア23567

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

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

yoshipu

2019/10/19 03:44

ありがとうございます。 自分の実装に自信を持ちました。
guest

0

paramsで値を取得する際にrequireを必ずしも使わなくもいいものなのでしょうか?
僕の解釈では、キーを指定してそれ以外を受け取らないようにする目的だと思うのでいらないのではないかと思いました。

はい、そのとおりです。必要なキーだけ確実に取得するのであれば、Strong Parameterなしで動かすことすら可能ですし、単純にモデルに代入するのでない場面ではparams以下に値を直接書くことも可能です。

投稿2019/10/17 22:11

編集2019/10/17 22:14
maisumakun

総合スコア145963

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

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

yoshipu

2019/10/19 03:44

ご回答ありがとうございます。
guest

0

まず簡単に両メソッドを簡単に説明させてください。

requireとpermitはStrong Parametersというもので、
Rails4系から追加されたDBへの操作が発生する際の受け取りパラメータを制御する仕組みです。

requireメソッドがデータのオブジェクト名(モデルの名前)を定め、
permitメソッドで変更を加えられる(保存の処理ができる)キー(カラム名)を指定します。

rails3まではMass Assignment脆弱性があったため、
このような仕組みが導入されています。

ーーーーー

これを踏まえてyoshipuさんの質問への回答です。

paramsで値を取得する際にrequireを必ずしも使わなくもいいものなのでしょうか?
僕の解釈では、キーを指定してそれ以外を受け取らないようにする目的だと思うのでいらないのではないかと思いました。

requireはオブジェクト名の指定をするメソッドなので、
仮にrequireの指定をせずにDBへの操作が許されるとすると、
別モデルで同じ名前のカラムのデータが混入する危険性などが考えられます。
*例えばUser.nameとanimals.nameがあった場合など

そのため、DBの操作が発生する際にはrequireとpermitを使用しないと
rails4より上のバージョンではExceptionが返る仕様だったと思います。

投稿2019/10/17 15:26

Nuu

総合スコア55

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

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

yoshipu

2019/10/19 03:44

詳細に説明していただきましてありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問