&tag(Ransack); *目次 [#mbfa3f82] #contents *参考情報 [#ufc216e0] -[[activerecord-hackery/ransack:https://github.com/activerecord-hackery/ransack]] // 公式サイト -[[#370 Ransack - RailsCasts:http://railscasts.com/episodes/370-ransack?language=ja&view=asciicast]] -[[Ruby - Ransackのススメ - Qiita [キータ]:http://qiita.com/nysalor/items/9a95d91f2b97a08b96b0]] *概要 [#t14acaff] -Railsで検索画面を作るための(?)gem。 -Kaminariと組み合わせ、カラムクリックでソートすることもできる。 *簡単な使い方 [#z3adda50] **インストール [#a39b267a] -Gemfileにransackを追加。 gem "ransack" **コントローラ [#n4975c64] -コントローラーのaction。例えばindexで検索する場合次のようになる。 #pre{{ def index @search = Item.ransack(params[:q]) @items = @search.result end }} ※searchじゃなくてransackメソッドのほうが推奨になったらしい(公式サイト) **ビュー [#x2d55501] -検索条件を指定するフォームの作成 #pre{{ <%= search_form_for @search do |f| %> <%= f.text_field :title_cont %> <%= f.submit '検索' %> <% end %> <% @items.each do |item| %> (省略) <% end %> }} *複雑な使い方 [#sc45293f] **ransack_demo [#f2c86b7b] [[ernie/ransack_demo:https://github.com/ernie/ransack_demo]]と、それを解説した[[#370 Ransack - RailsCasts:http://railscasts.com/episodes/370-ransack?language=ja&view=asciicast]]が参考になる。 ***セットアップ [#b9902986] -git clone git clone https://github.com/ernie/ransack_demo -bundle install bundle install --path vendor/bundle -データベース作成(postgresqlが必要。[[MacPorts/postgresql]]。ransack_demoユーザーを作成しておく) bundle exec rake db:create:all -テーブル作成 bundle exec rake db:migrate -テストデータ投入 bundle exec rake db:fixtures:load -サーバー実行 bundle exec rails s -ブラウザから http://localhost:3000 にアクセス *ビュー [#s2e33ac9] **search_form_for [#oe9ebf24] -search_form_forの定義は次のようになっている #pre{{ def search_form_for(record, options = {}, &proc) }} -最も単純 <%= search_form_for(@search) do |f| %> -クラスとurlを指定 <%= search_form_for(@search, url: items_path, html: {class: 'form-inline'}) do |f| %> *Tips [#q479a17d] **orderを手動で指定したい場合 [#n4cd42c5] -[[Sorting in the Controller · activerecord-hackery/ransack Wiki:https://github.com/activerecord-hackery/ransack/wiki/Sorting-in-the-Controller]]に方法が書いてある #pre{{ @search = Post.ransack(params[:q]) @search.sorts = 'name asc' if @search.sorts.empty? #一つの場合 @search.sorts = ['name asc', 'created_at desc'] if @search.sorts.empty? # 複数の場合 @posts = @search.result.paginate(page: params[:page], per_page: 20) }} -params[:q][:s]に無理やり突っ込む方法は古い。 **orderを手動で指定したい場合(古い方法) [#p7643075] -params[:q][:s]にORDER BYの値を渡してやる。 params[:q][:s] = "rating desc" -もしくはresult.orderでソート。 @search.result.order("rating desc") **カラムクリックしたときの初回のソートの向きを指定したい [#rd598170] -sort_linkのdefault_orderを指定する。 <%= sort_link(@q, :name, 'Last Name', default_order: :desc) %> **テーブルカラムと対応しない列で並べ替える場合 [#z755b783] -上の応用となる。sort_orderにリストで選択された"ソート順"が入っているとする。そのソート順からORDER BYの文字列を作ってやりセットする。 params[:q][:s] = build_sql(params[:sort_order]) -view側で、params[:sort_order]を初期値としてセットしてやれば条件も引き回せる。 **検索条件の引き回し [#qc51926a] -検索フォームとページングのナビゲーションを組み合わせて使う場合、検索ボタンを押して検索したパラメータが、ページングのナビゲーションに追加されて検索条件が引き回されることになる。 -検索条件を変えたら、いったん検索しないといけない。