🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

1回答

867閲覧

indexで検索された順番をユーザーごとに保存してshowで引き出すには?

KOO_

総合スコア58

Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2019/09/18 15:06

編集2019/09/20 02:18

こんにちは。

現在プログラミングの構築を行なっており、その中でindexで検索された順番をユーザーごとに保存してshowで引き出す方法についてお伺いしたく存じます。

以下、現在のプログラムです。

index

1<div class="heading"><h2>リスト検索</h2></div> 2 3<%= search_form_for @q do |f| %> 4 <table width = "90%"> 5 <col width="20%"> 6 <col width="30%"> 7 <col width="20%"> 8 <col width="30%"> 9 <tbody> 10 <tr> 11 <th colspan = "4">検索</th> 12 </tr> 13 <tr> 14 <th>会社名</th> 15 <td><%= f.search_field :company_cont, type: "text" %></td> 16 17 ... 18 19 <tr> 20 <th colspan = "4" ><%= f.submit '検索' %></th> 21 </tr> 22 <% end %> 23 </tbody> 24 </table>

ControllerDefIndex

1 @q = Customer.ransack(params[:q]) 2 @customers = @q.result

上記の条件では、showをクリックして、以下の前へ、次へを押すとsearch条件が解除されてしまいます。
(現在コードをいじっているので、適正なコードではないかもしれません。)

<% if prev_customer = @customer.prev_customer %> <%= link_to "前へ", customer_path(prev_customer), class: "prev btn btn-danger" %> <% end %> <% if next_customer = @customer.next_customer %> <%= link_to "次へ", customer_path(next_customer), class: "next btn btn-danger" %> <% end %>

理想としては、
indexでid1, id3, id5と検索されたものを
showで移動してもid1, id3, id5と移動出来るようにしたいのですが、
現在はid1, id2, id3とransackが解除されてしまいます。

ここを解決する方法としてcustomers_search_orderのデータベースを作りました。

customers_search_order

1class CreateCustomersSearchOrders < ActiveRecord::Migration[5.1] 2 def change 3 create_table :customers_search_orders do |t| 4 t.integer :admin_id 5 t.integer :customer_id 6 t.integer :prev_customer_id 7 t.integer :next_customer_id 8 t.timestamps 9 end 10 end 11end 12

これに検索内容を保存してshowでも見られるようにプログラムしたいのですが、残念ながらここから先の進め方、プログラムの仕方がわかりません。

どなたかご教示頂けないでしょうか?

よろしくお願い致します。

def index @q = Customer.ransack(params[:q]) @customers = @q.result @customers = @customers.where( id: last_call_customer_ids ) if !last_call_customer_ids.nil? @customers = @customers.page(params[:page]).per(100) end def show @customer = Customer.page(params[:page]).per(1) @call = Call.new @prev_customer = Customer.find_by(id: params[:id]) @next_customer = Customer.find_by(id: params[:id]) end

上記の形式の場合、pageを指定するとshowのviewsの中にエラーが出てきてしまいます。

ActionView::Template::Error (undefined method `company' for #<Customer::ActiveRecord_Relation:0x00007f9cf8afddd0> Did you mean? compact):

また、showのpaginateの指定は以下となります。

<%= paginate @customer, class: "prev btn btn-danger" %>

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

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

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

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

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

guest

回答1

0

やりたいことは pagenation という機能でそれを助けるgemがあります。
Kaminari とか will_paginate とかを調べてみて下さい。

投稿2019/09/19 02:46

winterboum

総合スコア23567

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

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

KOO_

2019/09/19 06:14

ご回答ありがとうございます。 pagenationやkaminariは検索を保存するような機能もあるのでしょうか? indexで指定件数表示するgemと認識しておりますが違いましたか? よろしくお願い致します。
winterboum

2019/09/19 06:46

やりたいことは 前、後へ移動したいということかと。 そうしますと 1ページあたり1件でページングすればよいかと思ったのです
KOO_

2019/09/19 07:37

そのような使い方も出来るのですね。 知識不足で申し訳ありませんが、その場合、indexのsearch情報はsaveされていないのですが、それをshowに適応することがそもそも出来るのでしょうか?
winterboum

2019/09/19 08:12

pagenationのgemの前、次のlinkにはsearch情報が保存されています。 ですから show でpagenationすればindexと同じ検索、ソート条件が保持されます。
winterboum

2019/09/19 08:16

実は似たようなことをやってまして、indexにあるチェックボックスにチェックが入っているものを次、前で表示していく。 この場合pagenationできないので、チェックされたmodelのidを溜めてます session[:request_ids] = [ 1,4,7,8,10] ssession[:current_point] ||= 0 って感じです。
KOO_

2019/09/20 02:19

お世話になっております。理屈は理解出来たのですが、今一つ実現したいことが解決出来ないので宜しければ実際にコードをご教示頂くことは可能でしょうか?現在のコードを追記させて頂きましたので、差し支えなければご教示よろしくお願い致します。
winterboum

2019/09/20 02:43

showにindexの3行を書き、最後の @customers = @customers.page(params[:page]).per(100) が @customer = @customers.page(params[:page]).per(1).first
KOO_

2019/09/20 03:17

ありがとう御座います。 undefined method `total_pages' for total_pageに関するエラーが   <%= paginate @customer %> で出てしまいます。 色々調べてみたのですが原因がわからないのですが、ご教示可能でしょうか?
winterboum

2019/09/20 06:12

そか、 @customers = @customers.page(params[:page]).per(1) @customer = @customers.first にして、 paginate @customer を paginate @customers でどうでしょう
KOO_

2019/09/20 10:07

そうですねー。上記のように変えると indexでどのlinkをクリックしても.firstとなっているからだと思いますが、一番始めのshowが登場してしまいます。また、次へをクリック出来るのですが、index順でしか表示されない見たいです。 .firstはどういう理由で使われているのでしょうか??
winterboum

2019/09/20 10:36

showでつかう@customerはCustomerのobjectです。 ですが@customers は要素数1の配列です。 配列から単独要素をえるために firstです。 indexのlinkは普通 ID でlinkしていますが、そこに pageも埋め込むと良いのかな。 その時の page はindexのpage、page当たりの数、indexの何番目か、で計算する
winterboum

2019/09/20 10:37

> index順でしか表示されない ん? そうしたかったのでは? > indexでid1, id3, id5と検索されたものを > showで移動してもid1, id3, id5と移動出来るようにしたい ということですから
KOO_

2019/09/21 07:02

ありがとう御座います。 indexではid3,id8,id14と表示されますが showではid1,id2,id3となってしまうのです。。
winterboum

2019/09/21 10:10

うーむ、、、、orderが渡っていないのかな。。 案1 これをさらに詰める 案2 sessionに保存させる 案3 DBにとる
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問