【问题标题】:How do I filter posts with Ruby-on-Rails如何使用 Ruby-on-Rails 过滤帖子
【发布时间】:2015-04-09 12:44:48
【问题描述】:

我设置了一个职位列表项目,我希望能够通过多个过滤器进行过滤。我希望能够拥有可以按某些元素过滤的侧边栏 - :city、:jobtype 和 :contracttype

是否有一种简单的方法来创建单选按钮,以显示用户可用的选项,例如:city 伦敦、曼彻斯特、布莱顿等的列表,可以勾选这些列表以显示这些特定的工作?

我是 Rails 新手,所以很难弄清楚我需要做什么,如果有人能解释我需要做什么,我将不胜感激!

我的代码如下:

index.html.erb -

<% @jobs.each do |job| %>
<div class="job">
    <h2><%= job.position %></h2>
    <p>Company: <%= job.company %></p>
    <p>Salary: <%= job.salary %></p>
    <p><a href="http://<%= job.companywebsite %>" target="_blank">Website: <%= job.companywebsite %></a></p>
    <p><a href="http://www.twitter.com/<%= job.companytwitter %>" target="_blank">Twitter: <%= job.companytwitter %></a></p>
    <p>Contract Type: <%= job.contract %></p>
    <p>City: <%= job.city %></p>
    <p>Expiry date: <%= job.expirydate %></p>
    <p>Job Type: <%= job.jobtype %></p>
    <p>Full Description:<br><br><%= job.description %></p>
    <p>How to apply: <%= job.apply %></p>
  </div>
<% end %>

job.rb -

class Job < ActiveRecord::Base
   validates :position, presence: true
   validates :company, presence: true
   validates :salary, presence: true
   validates :companywebsite, presence: true
   validates :companytwitter, presence: true
   validates :contract, presence: true
   validates :city, presence: true
   validates :expirydate, presence: true
   validates :jobtype, presence: true
   validates :description, presence: true
   validates :apply, presence: true
end

jobs_controller.erb -

class JobsController < ApplicationController
  def index
    @jobs = Job.page(params[:page]).per(25)
  end

  def new
    @job = Job.new
  end

  def create
    @job = Job.new(params.require(:job).permit(:position, :company, :salary, :companywebsite, :companytwitter, :contract, :city, :expirydate, :jobtype, :description, :apply ))
    if @job.save
      redirect_to root_path
    else
      render "new"
    end
  end
end

new.html.erb -

<%= simple_form_for @job, html: { multipart: true } do |form| %>
<%= form.input :position, input_html: { maxlength: 60 }, placeholder: "Job Position", label: false %>
<%= form.input :company, input_html: { maxlength: 60 }, placeholder: "Company name", label: false %>
<%= form.input :salary, input_html: { maxlength: 60 }, placeholder: "Salary", label: false %>
<%= form.input :companywebsite, input_html: { maxlength: 60 }, placeholder: "Company Website", label: false %>
<%= form.input :companytwitter, input_html: { maxlength: 60 }, placeholder: "Twitter Handle e.g @Hatch_Inc", label: false %>
<%= form.input :contract, input_html: { maxlength: 60 }, placeholder: "Contract Type", label: false %>
<%= form.input :city, input_html: { maxlength: 60 }, placeholder: "City", label: false %>
<%= form.input :expirydate, input_html: { maxlength: 60 }, placeholder: "Expiry date", label: false %>
<%= form.input :jobtype, input_html: { maxlength: 60 }, placeholder: "Job Type", label: false %>
<%= form.input :description, input_html: { maxlength: 60 }, placeholder: "Full job description", label: false %>
<%= form.input :apply, input_html: { maxlength: 60 }, placeholder: "How to apply", label: false %>
<%= form.button :submit %>
<% end %>

【问题讨论】:

    标签: ruby-on-rails ruby filtering


    【解决方案1】:

    这是一个使用 JQuery 提交 AJAX 请求的示例(因此您的页面不会在每次选中一个框时刷新)。在您看来,您为每个独特的国家/地区创建了一个复选框。 Jquery 参数化选定的国家并将它们提交给您的控制器(指定您要使用 JavaScript 响应)。 Jobs 模型中的范围应用过滤器。

    index.html.erb

    <div id='job-list'>
     <% @jobs.each do |job| %>
    <div class="job">
        <!-- Display your job here -->
      </div>
    <% end %> 
    </div>
    
    <div id='countries'>
        <h4> Country Filter: </h4>
        <% @countries= Job.uniq.pluck(:country) %>
        <% @countries.each do |c| %>
            <br><input id="<%= c %>" type="checkbox" class="country-select" checked><label for="<%= c %>"> <%= c %> </label>
        <% end %>
    </div>
    

    index.js.erb

    var jobs = $('#job-list');
    jobs.empty();
    
    <% @jobs.each do |job|%>
      jobs.append("<div class='job'><%= job %></div>"); // job display goes here
    <% end %>
    

    课程.咖啡

    getParams = ->
        params = ""
        countries = []
        $(".country-select:checked").each ->
          countries.push($(this).attr('id'))    
        params += "&#{$.param({countries: countries})}";
    
        return params
    
    $('.country-select').on 'change', (event) =>    
      $.ajax "/jobs.js?"+getParams(),
        type: 'GET'
        dataType: 'script'
    

    工作控制器

    class JobsController < ApplicationController
    
      respond_to :html, :js
    
      def index
        @jobs = Job.page(params[:page]).per(25).by_country(params[:countries])
      end
    
    end
    

    工作模式

    class Job < ActiveRecord::Base
    
      scope :by_country, -> (countries) { where(:country => (countries|| Course.uniq.pluck(:country)) ) }
    
    end
    

    【讨论】:

    • 您好,感谢您的回复。因此,如果我不一定介意包含 AJAX,那会如何影响事情呢?因此,使用您提供的代码,我将如何更改它以适应从我上面的代码中过滤我的 :city、:jobtype 和 :contract 字符串?
    • 您可以根据需要定义任意数量的范围,即一个用于城市、工作类型、合同的范围。您仍然可以像上面的代码一样生成复选框。您可以使用 link_to 代替 AJAX。请参阅this post 以“Rails”方式传递参数。
    • index.js.erb 文件在哪里?我有 index.html.erb 但没有 .js.erb?
    • 放在同一个文件夹里。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    相关资源
    最近更新 更多