<DAY132>同一viewを用いて異なるアクションを実行する場合
●7/2(火)
●学習日数 132日
●学習時間(本日)6時間
●累計学習時間 692.5時間
●一日あたりの平均学習時間 5.24時間
結論
前提条件と状況
●同一view内で検索機能を異なる人が実装した。
●検索方法の異なるgemを使用し、検索方法を実装した。
●自分が担当した検索機能はsearch copでform_tagでparamsを飛ばしていた。
アクションを分ける手順1
routesの追加。
共通のコントローラにて設定。
今回はidをURLにのせる必要がないので、
collecitonにて設定
resources :items do member do get 'under_exhibition' get 'exhibition_edit' get 'order_confirm' end collection do get 'second' get 'third' get 'item_search' #追加 get "item_search1" end
手順2 コントローラの設定
viewは使用しないので、renderにて使用したいアクションに飛ばす
class ItemsController < ApplicationController before_action :set_search, only: [:item_search,:item_search1] #商品検索LV1 def item_search1 @all_items = Item.all @items = params[:page][:name] @item_search = Item.item_search(@items) if @items.present? #renderにて表示したviewの設定 render action: :item_search end #商品検索LV2 def item_search @item_search = @search.result(distinct: true) @items = params[:q][:name_cont] end private def set_search @search = Item.ransack(params[:q]) end end
手順3 viewの設定
form_tagにて飛ばしたいリンク先はitem_search1のリンク。
コントローラでrenderにてitem_searchのviewを指定しているので、
エラーにならない。
.header-search__logo = link_to root_path do = image_tag 'header_icon.png', class:"image-logo" #collectionにてroutesをまとめるとprefixをきちんと表示してくれる = form_tag item_search1_items_path,method: :get,class:"header-search__box" do = text_field :page,:name, placeholder:"何かお探しですか?",class:"y-text-box" = button_tag "a",class:"y-buttom.search-icon" do .material-icons.search-icon search