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

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

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

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

Q&A

解決済

3回答

9618閲覧

【Ruby on Rails】paramsに初期値をセットしたい

pecchan

総合スコア555

Ruby on Rails

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

0グッド

2クリップ

投稿2017/05/18 07:32

編集2017/05/18 08:37

初歩的なことで恐れ入ります。

ビューからパラメータ(日付のFromとTo)を受け取り、両方とも空だった場合は
初期値として現在日をセットして表示したいです。

そこでまずパラメータが空かどうかのチェックを行いました。

下記のようにすると、検索から来た場合は
params[:q]の中に、
日付のFromである[:imp_date_gteq]、
日付のToである[:imp_date_lteq]
がそれぞれ存在しているので初期値をセット出来ますが、

そもそも画面の初期表示時に
まだ
params[:q]がnil のため
エラーになるようです。

ruby

1 # 一覧 2 def index 3 4 if params[:q].present? 5 if params[:q][:imp_date_gteq].present? != true && params[:q][:imp_date_lteq].present? != true 6 params[:q][:imp_date_gteq] = Date.today 7 params[:q][:imp_date_lteq] = Date.today 8 end 9 else 10 #ここでエラー↓ 11 params[:q][:imp_date_gteq] = Date.today 12 params[:q][:imp_date_lteq] = Date.today 13 end 14end

このような要件の場合、初期値をセットする方法があるでしょうか?

何か方法があれば教えて下さい。
宜しくお願い致します。

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

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

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

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

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

moke

2017/05/18 08:11

エラーが出るのはparams[:q]がnilだからです。私はModel.search(params[:q]||{imp_date_gteq: Date.today,imp_date_lteq: Date.today})とやってしまうんですが、細かい条件となると最適解を知らないですね。
pecchan

2017/05/18 08:38

moke様 有難う御座います。間違い(エラーの原因)を修正しました。
moke

2017/05/18 09:14 編集

見苦しいコードになりそうなので書くのを控えてましたが、よろしければ書きましょうか?
pecchan

2017/05/18 09:24

moke様 有難う御座います。どうしてそれが見苦しいかを考えることで私には勉強になります。良ければお願いします。
guest

回答3

0

ベストアンサー

dig メソッドを用いると、ハッシュ値の参照が簡単になります

ruby

1def index 2 # 参照するキー値がなかった場合にnil が返る 3 date_params = [parms.dig(:q, :imp_date_gteq), params.dig(:q, :imp_date_lteq)] 4 # 両方の値がnil か判定した結果を代入 5 date_both_nil = date_params.compact.size.zero? 6 7 # 日付データが両方空か、内容に応じて代入値を振り分け 8 @date_from, @date_to = 9 if date_both_nil 10 [Date.today, Date.today] 11 else 12 date_params 13 end 14end

params の利用は、ビューから渡される値の参照だけに留め、ビュー側ではコントローラから設定されるインスタンス変数を扱うようにするのがよいのではないでしょうか

何か参考になれば幸いです

Link

投稿2017/05/18 17:52

編集2017/05/18 18:15
gouf

総合スコア2321

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

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

pecchan

2017/06/23 00:19

遅くなり申し訳ございません。 大変参考になりました。 有難う御座います。
guest

0

これを機に私もベストプラクティスを考えようと思いましたが
ちょっと忙しいのでやっつけですみません。

ruby

1 search_params={} 2 if params[:q].present? 3search_params=params[:q] 4 if params[:q][:imp_date_gteq].present? != true && params[:q][:imp_date_lteq].present? != true 5 search_params[:imp_date_gteq] = Date.today 6 search_params[:imp_date_lteq] = Date.today 7 end 8 else 9 10 search_params[:imp_date_gteq] = Date.today 11 search_params[:imp_date_lteq] = Date.today 12 end 13 14Model.search(search_params) 15params[:q]=search_params#これで検索条件をformに戻す。

とりあえずRails4で動くコードです。Rails5だと動かないかも…。
絶対いい方法があるはずなんですが…とりあえず解決済みにするのは待っててください

投稿2017/05/18 09:22

編集2017/05/18 09:25
moke

総合スコア2241

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

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

pecchan

2017/05/18 09:27

moke様 お忙しいところ申し訳ないです・・・。 いったん解決済みを外しました。 ひとまず勉強しときます。 有難う御座います。
guest

0

def indexに引数でデフォルト値を置いてみてはどうでしょうか

def action(hoge="default_hoge") @hoge = hoge end

こうしたとき
params[:hoge]が存在する場合は
hoge = params[:hoge]

params[:hoge]がnilの場合は
hoge = default_hoge
となります

投稿2017/05/18 08:47

haneru

総合スコア440

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

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

pecchan

2017/05/18 09:08

haneru様 有難う御座います。 以下のようにしました。 def index(imp_date_gteq = Date.today) params[:q][:imp_date_lteq] = imp_date_gteq 結果的には同じでした。 検索で来た場合は、初期値セット出来ましたが 初期表示時は、params[:q]そのものがnilのためエラーになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問