Rails:使范围数据从索引到显示页面保持不变

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails:使范围数据从索引到显示页面保持不变相关的知识,希望对你有一定的参考价值。

我有一个包含工作列表的工作索引页面。用户可以应用“过滤器”,我使用范围根据某些类型的标准限制结果,例如“体验”

当用户点击索引页面中的作业时,他们会进入我有面包屑的作业显示页面。如果他们点击面包屑返回作业索引页面,则通过作用域设置的所有过滤器都已被清除。

用户应该能够1)在索引上设置搜索过滤器2)修剪搜索结果3)点击工作显示页面的链接4)能够点击痕迹导航回到作业索引页面所有范围仍然适用。我有1-3个工作,现在就想不出来#4。

一旦点击进入作业显示页面,我不确定如何从索引页面持久保存范围数据。我猜我是否可以存储它然后我可以将它作为参数传递给我回到索引页面?

我的导航面包屑在作业显示页面中

<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 %>

我在模型中的范围

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

在控制器中调用scope,它是索引操作的一部分

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

作业索引部分列出作业名称

<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-->
答案

将过滤器提交给会话。

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。如果有参数,它将重置参数的会话数据(相应地命名您的会话[:foo])。如果有会话数据,它将执行范围。没有会话数据,没有范围。

如果页面被刷新,则添加清晰的会话数据方法是值得的。否则,您的记录将作用于用户清除cookie之前的范围!

以上是关于Rails:使范围数据从索引到显示页面保持不变的主要内容,如果未能解决你的问题,请参考以下文章

刷新页面时 select值保持不变

如何使 DRF ( Django-REST-Framework) 令牌保持不变,使其在每次页面刷新后不会丢失?

如何使表单数据在“从缓存重新加载”时持续存在

从角度 8 的导航栏中选择一个选项后,如何使侧面导航保持不变并且内容单独消失?

如何从rails中的视图将值传递给jquery?

Rails - 在项目模型的索引页面上显示来自客户端模型的数据