yujiroのプログラミング

勉強内容をアウトプットし、サボらないようにする為のブログ

<DAY132>同一viewを用いて異なるアクションを実行する場合

\ Follow me!! /

●7/2(火)
●学習日数 132日
●学習時間(本日)6時間
●累計学習時間 692.5時間
●一日あたりの平均学習時間 5.24時間

結論

アクションを分けることで解決する

前提条件と状況

●同一view内で検索機能を異なる人が実装した。
●検索方法の異なるgemを使用し、検索方法を実装した。
●自分が担当した検索機能はsearch copでform_tagでparamsを飛ばしていた。


https://i.gyazo.com/10d46243a61f9d271fdba9aa7259c3bf.gif


アクションを分ける手順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