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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

473閲覧

will_paginateで表示しているモデルの検索と再表示

lyzmfeqpxs54

総合スコア237

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2017/09/01 01:27

編集2017/09/01 13:21

現在、以下の画像のようなものをwill_paginateを用いてページに表示しております。画像の上にはまた別のフォームなどが存在しています。

適用ボタンが押された場合に入力範囲のデータのみを表示できるようにwhereメソッドでデータベースを絞りrenderメソッドで再表示しています。

ここで問題が起きているのですが、この再表示後、データベース自体はきちんと絞られ下に表示されているページ数も変わりました。しかし、ページ番号を押すと、データの表示が初期状態(全て標示されている状態)へと戻ってしまいます。

質問なのですがデータベースを再表示する際にはrenderメソッドを使うのは間違いなのでしょうか。正しいやり方をご教示いただければ幸いです。
よろしくお願いいたします。

Ruby

1# user_controller.rb 2 3# 適用ボタンの処理(where内も実際は取得したパラメーターで行うつもりです) 4def select 5@maildbs = Maildb.where(date: "2016-11-15").paginate(page: params[:page], per_page: 10) 6 7// ページを再表示 8render 'user/personal' 9 10end

{"utf8"=>"✓", "authenticity_token"=>"dXd7s(省略)", "from_date(1i)"=>"2017", "from_date(2i)"=>"9", "from_date(3i)"=>"1", "to_date(1i)"=>"2017", "to_date(2i)"=>"9", "to_date(3i)"=>"1", "commit"=>"適用","controller"=>"user", "action"=>"update", "id"=>"XXXXXXX"}

Ruby

1 2def select 3# 適用ボタンが押された際にparamsから日付の値を取りデータ型に直してwhere句で絞込みをしている 4@from = Date.new(params[:"from_date(1i)"].to_i, params[:"from_date(2i)"].to_i, params[:"from_date(3i)"].to_i) 5@to = Date.new(params[:"to_date(1i)"].to_i, params[:"to_date(2i)"].to_i, params[:"to_date(3i)"].to_i) 6@maildbs = Maildb.where(date: @from..@to).paginate(page: params[:page], per_page: 10) 7 8# このような場合検索条件をパラーメータでという部分がわかりません 9ご教示いただいた 10@params_for_select = {:xxx => params[:xxx]} 11部分が 12@params_for_select = where(date: @from..@to) 13のような形ですとイメージが沸くのですが…… 14params[:xxx]として一つの値を渡しても検索条件につながらないのではと考えてしまいます 15 16 17end

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

renderメソッドは問題ないかと思います。

おそらく、prev,1,2,3,4,... nextなどの<%= will_paginate %>で作成されるボタンに
「適用」した際の検索条件が渡せていないのでは?と思います。
確かめるには@maildbsの値をデバッグしてみれば早いかと。

気になって調べてみました。
すこし古いですがこちらのブログ
が参考になると思います

個人的に一番発見だったのは、params パラメーターの存在。こんな感じでパラメーターを次のページに引き渡せる。検索結果のページをページ送りする際に、検索条件が入っているterm パラメーターを引き継ぐ必要があったので、その際に利用した。

<%= will_paginate @items, :params=>{:term=>params[:term]}%>


以下追記

もし今回適用するならまずはコントローラーで引き継ぐパラメーターを取得します

ruby

1def select 2 @maildbs = Maildb.where(date: "2016-11-15").paginate(page: params[:page], per_page: 10) 3 // 表示パラメーターを取得 4 @params_for_select = {:xxx => params[:xxx]} # こんな感じで引き継ぐパラメーターをセット 5 // ページを再表示 6 render 'user/personal' 7end

そしてerb側でそれをセット

html

1<%= will_paginate @items, :params=>@params_for_select %>

投稿2017/09/01 01:51

編集2017/09/01 04:01
h_daido

総合スコア824

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

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

lyzmfeqpxs54

2017/09/01 02:44

早速のご回答ありがとうございます。”「適用」した際の検索条件を渡す”という部分ですが、適用ボタンが押された際、以下のようなparamsをPOSTしており、from_date(1i)などから値を取ってwhere句で絞込を行おうとしております。 {"utf8"=>"✓", "authenticity_token"=>"dXd7s(省略)", "from_date(1i)"=>"2017", "from_date(2i)"=>"9", "from_date(3i)"=>"1", "to_date(1i)"=>"2017", "to_date(2i)"=>"9", "to_date(3i)"=>"1", "commit"=>"適用", "controller"=>"user", "action"=>"update", "id"=>"XXXXXXX"} このような場合、ページ移動をするたびにモデルに条件を渡すというにはどのようにすればよいのでしょうか。勉強不足で申し訳ございません。
h_daido

2017/09/01 03:54

「適用」を押したとき、usersControllerの#selectを呼んでますよね? そのcontrollerの中でparams[:xxx]で取得できるはずです。 条件はそれで取得できるので、あとはそれをviewに渡していきます(modelでなく) やり方は簡単で、erbの中で書くだけです。 イメージを追記しときます。
lyzmfeqpxs54

2017/09/01 05:43

度々のご回答ありがとうございます。不勉強で申し訳ありません。 paramsなのですがたとえばparams[:id]とした場合"XXXXXXX"部分は返ってくるのですが、params[:from_date(1i)]とした場合にエラーが出てしまいます(params[:from_date]では何も返ってこない)。 where(date: "2016-11-15") 部分を where(date: "#{params[:from_date(1i)]}-#{params[:from_date(2i)]}-{params[:from_date(3i)]}" というような形で書いていこうと思っていたのですがこういうやり方は間違っていますでしょうか。
lyzmfeqpxs54

2017/09/01 06:47

params[:from_date(1i)]でエラーが出ていた問題はparams[:"from_date(1i)"]という風にダブルクォーテーションでくくることで解決しました。お騒がせしました。 しかし、検索条件をパラメータに含めるという部分がいまいち理解できず……。もう少し詳しくご教示いただくことができれば幸いです。
h_daido

2017/09/01 09:22

けんさく条件をパラメーターに含めるというのは、 controllerでparams[:xxxx]で取得してきた値をviewに渡してあげるということです。以下の処理のところですね。 @params_for_select = {:xxx => params[:xxx]} # こんな感じで引き継ぐパラメーターをセット としているところですね。 これで、<%= will_paginate 内で@params_for_selectを使えるので、検索条件が引き継げるのではと思います。
lyzmfeqpxs54

2017/09/01 13:24

度々のご回答、本当にありがとうございます。実際に使用しているメソッド(適用ボタン押下時)と引っ張ってきているパラーメータを追記いたしました。そちらに現状分かりかねている部分を書かせていただきました。不勉強で申し訳ありませんが、もう少しだけご助力いただければと思います。 よろしくお願いいたします。
h_daido

2017/09/02 14:11

@params_for_selectにセットするのは、whereで絞り込んだactive_recordデータの配列ではなく、あくまでselectコントローラーに渡される検索条件を次に渡すときに使うイメージです。なので形式はHashですね。 例文のxxxは一つですが、当たり前ですが、検索条件の数だけセットしてあげる必要があります。 {"from_date(1i)" => params["from_date(1i)"], "from_date(2i)" => params["from_date(2i)"] .... といったかんじですね。 面倒であれば、hashのexceptを使って不要なものを削除してしまえば良いかとおもいます。以下のような感じ @params_for_select = params.except("utf8", "authenticity_token", "commit","controller", "action", "id") このようにすると、@params_for_selectには"適用"を押した時の検索条件がhash形式でセットされることになります。 それが、render 'user/personal'のerb内でwill_pagenateにセットされ、will_pagenateのボタンが押された際のアクションにもセットされるようになるはずです(これがブログ内の引用部分の動きです) あとは、will_pagenateのボタン押下時に呼び出されるコントローラー(その部分は貼ってもらってないので、わかりませんが、おそらくusersController#personalアクション?)内でparamsを解析して条件を絞ってあげれば完成です。なお、その部分の動作はselectアクションと共通する部分が多いと思うので、メソッド切り出すとかすると良いかもですね。
lyzmfeqpxs54

2017/09/04 05:15

ご回答ありがとうございます。 ようやくおっしゃりたいことが理解できました。パラメータを複数指定することでURLにその指定したパラメータが含まれることとなり、その情報を用いて検査条件とし、データを絞って表示という流れですね。ようやくやりたいことが実現できました。 長々とおつきあいいただき本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問