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

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

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

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

Vagrant

Vagrantは、VirtualBox上の仮想マシンを コマンドラインから作成してくれるソフトウェアです。 ビルド環境など容易に構築が可能です。

Q&A

解決済

1回答

2446閲覧

Railsの検索機能の実装について教えてください。

koume

総合スコア458

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

Vagrant

Vagrantは、VirtualBox上の仮想マシンを コマンドラインから作成してくれるソフトウェアです。 ビルド環境など容易に構築が可能です。

0グッド

0クリップ

投稿2017/08/21 23:48

編集2017/08/22 05:49

Webアプリケーションを作っています。その中で検索フォームから送信されてくるデータを受け取って、該当する顧客を検索して
リスト表示するという機能を実装したいのですが、ストロングパラメータとの関係でどういう風にコードヲ記述すればいいか
わからずに困っております。(参考書に沿った形で記述していました。)
indexアクションに以下の通り記述していました。

app/controllers/staff/customers_controller.rb class Staff::CustomersController < Staff::Base def index @search_form = Staff::CustomerSearchForm.new(params[:search]) @customers = @search_form.search.page(params[:page]) end ・ ・ ・

このままアクセスするとForbiddenAttributesErrorが発生してしまうのでストロングパラメータに関する記述をしました。

app/controllers/staff/customers_controller.rb class Staff::CustomersController < Staff::Base def index @search_form = Staff::CustomerSearchForm.new(customer_params) @customers = @search_form.search.page(params[:page]) end ・ ・ ・ private def customer_params params.permit(customer: [ :family_name_kana, :given_name_kana, :birth_year, :birth_month, :birth_mday, :address_type, :prefecture, :city, :phone_number] ) end end

エラーは解消しページは表示されるのですが、検索機能が働いてくれないのでどうすればいいのかわからずに困っております。
たぶん、new(params[:search])の部分をnew(customer_params)に変えたことにより
(params[:search])でフォームの各フィールドに入力された値をハッシュとして取得できなくなってしまい
検索機能が上手く動かないのかな?と考えています。
そこで、検索機能はそのまま機能させ、そのうえストロングパラメータは有効にしたままにするためにはどうしたらいいのでしょうか?
どなたか教えてください。宜しくお願いします。

ログ表示の追記

Started GET "/customers?utf8=%E2%9C%93&search%5Bfamily_name_kana%5D=&search%5Bgi ven_name_kana%5D=%E3%82%B8%E3%83%AD%E3%82%A6&search%5Bbirth_year%5D=&search%5Bbi rth_month%5D=&search%5Bbirth_mday%5D=&search%5Bgender%5D=&search%5Baddress_type% 5D=&search%5Bprefecture%5D=&search%5Bcity%5D=&search%5Bpostal_code%5D=&search%5B phone_number%5D=&search%5Blast_four_digits%5D=&commit=%E6%A4%9C%E7%B4%A2" for 10 .0.2.2 at 2017-08-22 05:37:38 +0000 Processing by Staff::CustomersController#index as HTML Parameters: {"utf8"=>"✓", "search"=>{"family_name_kana"=>"", "given_name_kana" =>"ジロウ", "birth_year"=>"", "birth_month"=>"", "birth_mday"=>"", "gender"=>"", "address_type"=>"", "prefecture"=>"", "city"=>"", "postal_code"=>"", "phone_num ber"=>"", "last_four_digits"=>""}, "commit"=>"検索", "host"=>"chibi.example.com" } StaffMember Load (0.5ms) SELECT `staff_members`.* FROM `staff_members` WHERE `staff_members`.`id` = 11 LIMIT 1 Unpermitted parameters: :utf8, :search, :commit, :host {} Unpermitted parameters: :utf8, :search, :commit, :host Rendering staff/customers/index.html.erb within layouts/staff Rendered staff/customers/_search_form.html.erb (43.1ms) (0.8ms) SELECT COUNT(DISTINCT `customers`.`id`) FROM `customers` Customer Load (0.7ms) SELECT DISTINCT `customers`.* FROM `customers` ORDER B Y `customers`.`family_name_kana` ASC, `customers`.`given_name_kana` ASC LIMIT 10 OFFSET 0 Rendered staff/customers/index.html.erb within layouts/staff (105.4ms) Rendered staff/shared/_header.html.erb (1.0ms) Rendered shared/_footer.html.erb (0.5ms) Completed 200 OK in 207ms (Views: 198.3ms | ActiveRecord: 2.0ms) ^C- Gracefully stopping, waiting for requests to finish === puma shutdown: 2017-08-22 05:40:21 +0000 === - Goodbye! Exiting

と出ていました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ruby

1def customer_params 2 params.permit(customer: [ 3 :family_name_kana, :given_name_kana, 4 :birth_year, :birth_month, :birth_mday, 5 :address_type, :prefecture, 6 :city, :phone_number] 7 ) 8end

この形でストロングパラメータを書いていますので、

ruby

1customer_params = { 2 customer: { 3 family_name_kana: "ああああ", 4 given_name_kana: "いいいい", 5 birth_year: "2000", 6 birth_month: "05", 7 birth_mday: "05", 8 address_type: "", 9 prefecture: "", 10 city: "", 11 phone_number: "" 12 } 13}

のような形でcustomer_paramsを取得できます。
ですので、

ruby

1@search_form = Staff::CustomerSearchForm.new(customer_params[:customer])

とすればいいのでは無いでしょうか?

####追記

Parameters: {"utf8"=>"✓", "search"=>{"family_name_kana"=>"", "given_name_kana" =>"ジロウ", "birth_year"=>"", "birth_month"=>"", "birth_mday"=>"", "gender"=>"", "address_type"=>"", "prefecture"=>"", "city"=>"", "postal_code"=>"", "phone_num ber"=>"", "last_four_digits"=>""}, "commit"=>"検索", "host"=>"chibi.example.com" }

という形でparameterが流れてきていますので、customer_paramsは空になっていますね。その下数行のところにある{}というやつです。
formからsearchという名前で飛んできていますので、formの方でsearchからcustomerに変更するか、

ruby

1 def customer_params 2 params.permit(search: [ 3 :family_name_kana, :given_name_kana, 4 :birth_year, :birth_month, :birth_mday, 5 :address_type, :prefecture, 6 :city, :phone_number] 7 ) 8 end

として、

ruby

1@search_form = Staff::CustomerSearchForm.new(customer_params[:search])

とするかのどちらかだと思います。

投稿2017/08/22 01:09

編集2017/08/22 06:09
chelsy7110

総合スコア596

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

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

koume

2017/08/22 05:09

回答ありがとうございます。教えていただいた通りに打ち込んで見ましたが 状況は変わりませんでした。もしかしてcustomer_params = { customer:{ ・・・}}のコードも記述するのでしょうか?その場合どこに記述するのでしょうか?
chelsy7110

2017/08/22 05:12

pryを使ったり、logger.debug customer_paramsというコードを打ち込んでみてcustomer_paramsがどういう形になっているのかを確認して見てはどうでしょうか。 customer_params = { customer:{ ・・・}}というコードは打ち込む必要はありません。
koume

2017/08/22 05:21

早急のご返事ありがとうございます。logger.debug customer_paramsを どこに記述し、その結果はどこに表示されるのでしょうか?全くはじめて 目にするコードなので教えてください。お願いします。
chelsy7110

2017/08/22 05:27

def indexのすぐ下に入れてみてください。そうすると実行されたときにcustomer_paramsはどういう値なのかがログに出てくると思います。
koume

2017/08/22 05:55

やってみました。ログの内容を質問欄に追記しました。ジロウという名前で検索したログです。given_name_kanaにジロウとなっていますので入力した値はちゃんと取得できているのかな?と思います。 やはり、これをフォームオブジェクトに引数として渡せていないのが原因とは思いますが、どうやって コードを記述すれば渡せるのかがわかりません。どうすればいいのでしょうか?
chelsy7110

2017/08/22 06:10

回答に追記しました
koume

2017/08/22 06:30

ありがとうござます。解決しました。毎日、エラーとの格闘をしていますが 難しいものですね。今後とも宜しくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問