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

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

詳細はこちら
Ruby on Rails 5

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

Ruby

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

Q&A

解決済

2回答

761閲覧

Railsのpermitについて

yuuki0218

総合スコア22

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2019/11/12 04:51

編集2019/11/12 05:21

Railsのpermitメソッドについて、モデルに渡す以外のところで使おうと思ったら、中々うまくいかなので、質問させていただきます。

環境

Ruby 2.6.5
Ruby on Rails 5.2.0
CentOS 7.7(Docker)

やりたいこと

検索フォームから受け取った値をストロングパラメータで検証したい。

検索フォームから受け取ったパラメータをto_hashする必要があり、その際に、[params.permit!]みたいな記述で検証をパスしていたが、
受け取るパラメータのみで絞りたいので、permitを使いたい。

できない理由

children_controller.rb

def search Rails.logger.error("parameter ==== #{params.class}") params = params.permit( :paramA, :paramB, :paramC, ) params = params.to_hash end

上記のようにしてパラメータ検証しようとおもったが
undefined method ``permit' for nil:NilClassが出力される。。

children_controller.rb

1Rails.logger.debug(params.class)とすると 2=> ActionController::Parameters

Paramertersオブジェクトに対してpermitするとエラーがでる?
モデル検証以外にpermitを使う際はpermit!で全部許可する指定がベターだと思う?のですが、
それ以外の場合上記のようにpermit(:paramA, :paramb...)としたい場合はどのような書き方をすればよいでしょうか?

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

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

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

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

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

maisumakun

2019/11/12 05:10

> 上記のようにしてパラメータ検証しようとおもったが とありますが、メソッド全体とそれをどこに書いたかを記載してください。
yuuki0218

2019/11/12 05:16

ご指摘ありがとうございます。 少し追記してみました。
guest

回答2

0

ベストアンサー

NillClassのオブジェクトにpermitを使用しようとしているので質問以前の問題です。

投稿2019/11/12 04:57

Mugheart

総合スコア2349

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

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

yuuki0218

2019/11/12 05:12

上記で載せているソースは簡易的なものであったため、もう少し詳しく載せます。 以下のような記述であれば、paramsが`NilClass`オブジェクトではないと思うのですが、認識間違いありますでしょうか。 ``` def search(params) Rails.logger.error("parameter ==== #{params.class}") # => ActionController::Parameters params = params.permit( :A, :B, :C, :D ).to_hash end ```
Mugheart

2019/11/12 05:19

まず、誤解しているところを正すと、元々のRailsのparamsというのは変数名ではなくメソッド名です。 ですので params = とした時点でparams変数がnilで初期化されて用意されるのでparamsメソッドの呼び出しができなくなり、代わりにnilのparams変数が呼ばれるようになります。 ですのでその後のparams.permitはnilに対してpermitを実行していることになります。
Mugheart

2019/11/12 05:21

ちなみに代入構文で右辺から評価されないというのは違和感があるかもしれませんが、 > params = とした時点でparams変数がnilで初期化されて用意される というのはRubyの構文解析の仕様です。
Mugheart

2019/11/12 05:28 編集

代入構文の評価順位ついては a = a をrubyで実行しても undefined local variable or method `a' for ... のエラーが発生しないのでそれで納得していただけるはずです。
yuuki0218

2019/11/12 07:19

丁寧な説明ありがとうございます。 完全に誤解していました、paramsという変数にパラメータの値が挿入されていると考えていたのですが、 確かにご指摘通り、paramsがメソッド名であれば、params = としたら初期化されてエラーになりますね。。 代入の評価順位についても、なるほど勉強になりました。 params = の記述をなくし、params.permit(...).to_hashとしたところ、問題なくHash化することまで確認できました。 ほかの方の回答でも同様の指摘をいただきましたが、いち早く回答いただいたのでベストアンサーとさせていただきます。 ありがとうございました。
guest

0

def search(params)ですが、これはコントローラーのアクションメソッドでしょうか。

そうだとしたら、paramsは引数に来るのではありませんdef searchと引数なしにしてください。

投稿2019/11/12 05:18

maisumakun

総合スコア145975

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

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

yuuki0218

2019/11/12 05:20

コントローラのアクションメソッドです。 こちらについてすみません、手打ちで入力していたため、記述ミスが起きていました。 実際は引数を渡しておりません。修正しておきます。
maisumakun

2019/11/12 05:23

params.permit(...).to_hashと一気にやってしまったらどうなりますか? params =と代入しようとすると、コントローラーにもとからあるparamsメソッドと別に、paramsというローカル変数ができてしまいます。
yuuki0218

2019/11/12 07:21

回答ありがとうございます。 params = してしまうと、params変数(nil)が生成されることご指摘通りでした。 params.permit(...).to_hashとしたとことうまく動作しました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問