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

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

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

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

Ruby on Rails 6

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

Ruby on Rails

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

API

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

Q&A

解決済

1回答

2077閲覧

楽天APIを使用した詳細検索機能で、パラメータが不足した状態で検索実行した場合デフォルト値が入るようにしたい

komiso

総合スコア1

Ruby

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

Ruby on Rails 6

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

Ruby on Rails

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

API

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

0グッド

1クリップ

投稿2020/07/24 16:16

編集2020/07/24 16:18

前提・実現したいこと

※プログラミング初心者です。失礼があったら申し訳ございません

楽天のAPIを使用して、キーワード検索と詳細検索の2つの機能を有したアプリを作成しています。
詳細検索では、

  • ジャンルID
  • キーワード
  • 除外キーワード
  • 並び替え
  • 送料の有無

を選択して検索できるような機能を目指しています。

以下は、コントローラー側でフォームからパラメーターを受け取った後の処理です。
(キーワード検索の場合)

RakutenWebService::Ichiba::Item.search(keyword: params[:keyword], page: page)

例えば、詳細検索で並び替えを選択して楽天APIを使用する場合は下記になります。

RakutenWebService::Ichiba::Item.search(keyword: params[:keyword], sort: params[:sort] ,page: page)

発生している問題・エラーメッセージ

上記記述の場合、keywordやsort以外にもNGKeywordなど、詳細検索で使用できる全てのパラメータを受け取る必要があります。

ただし、下記のように記述した場合、なにか1つでも値が入ってないとエラーとなってしまいます。

RakutenWebService::Ichiba::Item.search(keyword: params[:keyword], sort: params[:sort], NGKeyword: params[:NGKeyword], genreId: params[:genreId], postageFlag: params[:postagFlag] ,page: page)

試したこと

下記のように、if params[:sort].present? で1つずつのパラメータはチェックさせることができるのですが、膨大なパターンとなりあまり現実的ではないように思ってます。

def searchRequest(page) if params[:sort].present? RakutenWebService::Ichiba::Item.search(keyword: params[:keyword], NGKeyword: params[:NGKeyword], sort: params[:sort] ,page: page) else ngword = "" RakutenWebService::Ichiba::Item.search(keyword: params[:keyword], page: page) end end

なにか良いビジネスロジックはございませんでしょうか?

各パラメーターに何かしらのデフォルト値があって、フォームからnilが返ってきた場合はそのデフォルト値を使う・・・とかがいいのかなと思いましたが記述をどうすればよいのか?そもそもこの考え方でよいのか迷っております。

どうかご教授お願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

「各パラメーターに何かしらのデフォルト値があって」とありますが、
「どういうデフォルト値を入れたらよいかがわからない」のか
「どのようにデフォルト値を定義するのが良いのかがわからない」のか何方でしょう
前者ですとお手伝いできませんが、後者でしたら
default_params = {keyword: "key", NGKeyword: "ng", sort: "sort",page: "page"}
と定義しておいて
merged_params = default_params.merge(params.permit(keylist))
として merges_params を使ってください。
なお、permit(keylist)をつけないと 「permitしていないparamsはHashにできない」エラーになります。keylistには必要な全項目の列挙を。

投稿2020/07/25 00:33

winterboum

総合スコア23567

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

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

komiso

2020/07/26 02:11 編集

ご回答頂きありがとうございます! 知識不足のため、噛み砕くのに時間がかかってしまいご返信遅れて申し訳ございません。 以下のように記述しました。 ```ruby def searchRequest(page) default_params = { NGKeyword: "NGKeyword" } merged_params = default_params.merge(params.permit(:keyword, :NGKeyword, :genreId, :postageFlag, :sort, :page)) RakutenWebService::Ichiba::Item.search(merged_params) ``` この場合、NGKeywordが未入力の場合は、default_paramsの"NGKeyword"が渡される想定だったのですが、どうやらform_withのtext_fieldから未入力の場合はNGKeyword=>""が返ってきてるみたいで、設定値ではなくこちらを適用してしまい、【NGKeyword is not valid】が出てしまいます。 これは、コントローラー側で条件式で、if params[:NGKeyword].present?のように逃げるしかなさそうでしょうか? それとも、私のデフォルト値の記述違い、もしくは認識違いがございますでしょうか?
winterboum

2020/07/26 03:08

認識の通りですね。 default設定するkeyはいくつ有りますか?たくさんあると if params[:NGKeyword].present? だと醜いですね、 params.permit(keylist).select{|k,v| v.present?} をmergeしましょう
komiso

2020/07/27 02:30

即レスありがとうございます! selectメソッド勉強させていただきました。 教えていただいた書き方ですと、ハッシュの中身をselectメソッドで評価して、valueが真のものだけを抽出できるのですね。 これをdefault_paramsにmergeすることによって、NGKeywordなど未入力の場合はmergeされずにデフォルト値が有効になる、という解釈をしました。 そして、最終的な書き方は以下のようにすることで想定していた機能を実現することが出来ました。 ```ruby def searchRequest(page) default_params = { NGKeyword: "NGKeyword", postageFlag: 0, sort: "standard" } merged_params = default_params.merge(params.permit(:keyword, :NGKeyword, :genreId, :postageFlag, :sort, :page).select{ |k,v| v.present?}) RakutenWebService::Ichiba::Item.search(merged_params) end ``` おかげさまで助かりました!感謝いたします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問