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

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

ただいまの
回答率

89.04%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,196

koume

score 162

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


と出ていました。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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


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

customer_params = {
  customer: {
    family_name_kana: "ああああ",
    given_name_kana: "いいいい",
    birth_year: "2000",
    birth_month: "05",
    birth_mday: "05",
    address_type: "",
    prefecture: "",
    city: "",
    phone_number: ""
  }
}


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

@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に変更するか、

  def customer_params
    params.permit(search: [
      :family_name_kana, :given_name_kana,
      :birth_year, :birth_month, :birth_mday,
      :address_type, :prefecture,
      :city, :phone_number]
    )
  end


として、

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/22 14:55

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

    キャンセル

  • 2017/08/22 15:10

    回答に追記しました

    キャンセル

  • 2017/08/22 15:30

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

    キャンセル

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

  • ただいまの回答率 89.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る