2017-12-19 13 views
0

私はジョブリストを持つジョブインデックスページを持っています。ユーザーがスコープを使用して「経験」などの基準の種類に基づいて結果を限定する「フィルタ」があります。Rails:スコープデータをインデックスから永続化してページを表示する

ユーザーがジョブに表示されるインデックスページのジョブをクリックすると私はブレッドクラムを持っているページ。そのパンのクラムをクリックしてジョブのインデックスページに戻ると、スコープで設定されたすべてのフィルタが消去されます。

ユーザは、1)インデックスに検索フィルタを設定すること2)検索結果をトリミングすること3)ジョブ表示ページへのリンクをクリックすること4)パンくずリストのナビゲーションをクリックすることジョブのインデックスページを開き、すべてのスコープを適用します。私は1-3の仕事をしていますが、今は#4を理解できません。

クリックしてインデックスページからそのスコープデータを保持する方法がわかりません。私はそれを格納することができます私はインデックスページに戻って行くとき私はパラメータとして渡すことができると思いますか?

仕事の私のナビゲーションブレッドクラムは、モデル

indexアクション

# scopes 
    if params[:experience].present? 
    @jobs = @jobs.by_experience(params[:experience]) 
    end 

の一部であるコントローラにスコープを呼び出す

scope :by_experience, -> (ex) { where(experience: ex) if ex.present? } 

<nav aria-label="breadcrumb" role="navigation"> 
    <ol class="breadcrumb"> 
    <li class="breadcrumb-item"><%= link_to "Search Results", filtered_jobs_path(experience: params[:experience]) %></li> 
    <li class="breadcrumb-item active" aria-current="page">Job Details</li> 
    </ol> 
</nav> 

     <% if params[:experience].present? %> 
     <%= 'test' %> 
     <% end %> 

私の範囲のページを表示しますジョブ名をリストするjobs index partial

<div class="jobs_index_middle_panels col-md-6"> 

<!-- displays error message if search term can't be found, ignores nil values --> 
<% filter_array = [ params[:experience], 
params[:num_days_past], params[:company], params[:search], params[:l] ].compact %> 

<% if @jobs.present? %> 
    <!--kaminari gem helper method--> 
    <h5 class="text1"><%= page_entries_info @jobs, entry_name: 'job' %></h5> 
<% else %> 
    <h5 class="text1">No jobs found. Try removing the following filters: 
    <span class="text-danger"><%= filter_array.join(", ") %></span></h5> 
<% end %> 


    <% @jobs.each do |job| %> 

     <div class="card"> 
     <div class="card-block"> 
      <h4 class="vert-spacing2"><%= link_to job.title, job_url(job.id), class: "text-danger" %></h4> 
      <div class="vert-spacing1"><%= job.company %></div> 
      <div class="vert-spacing1"><%= truncate(job.description, length: 200, separator: ' ') %></div> 
      <b><%= job.city.capitalize %>, <%= job.state %></b> 
      <span class="pull-right"><%= time_ago_in_words(job.created_at) + " ago" %></span> 
      <%= number_to_currency(job.salary) %> 
     </div> 
     </div><br> 

    <% end %><!--./jobs--> 

    <!--pagination: uses kaminari gem --> 
    <nav aria-label="Page navigation"> 
    <ul class="pagination justify-content-center"> 
     <%= paginate @jobs %> 
    </ul> 
    </nav>  



</div><!--./jobs_index_middle_panels--> 

答えて

0

セッションにフィルタをコミットします。

if params[:experience].present? 
    session[:filter_on_experience] = params[:experience] 
end 
if session[:filter_on_experience].present? 
    @jobs = @jobs.by_experience(params[:experience]) 
end 

ここで行っていることは、パラメータの代わりにセッションデータをフィルタリングするようにスコープを変更することです。 paramsがある場合、パラメータのセッションデータをリセットします(それに応じてsession [:foo]に名前を付けます)。セッションデータがある場合、スコープを実行します。セッションデータはなく、スコープはありません。

ページをリフレッシュすると、クリアなセッションデータメソッドを追加することは価値があります。さもなければあなたの記録はユーザーがクッキーをクリアするまでスコープされます!

+0

興味深い。私はそれをユーザーのサインインの有無にかかわらず動作させる必要があります。だから私はあなたの提案を使うことができるとは思わない。 – Scott

+1

その場合、Paramsを一意に指定し、あなたのlink_toで前後に渡します。 foo_bar_path(my_param1:param1、my_param2:param2 ...)それはたくさんのハードコーディングですが、うまくいくでしょう。 –

+0

あなたのショーコンテンツをモーダルでレンダリングして、ユーザーが実際にインデックスページを離れないようにしてください。 –