2015-02-09 80 views
0

我有一个工作列表项目,我希望能够通过多个过滤器进行过滤。我希望能够有可以通过某些元素进行过滤的边栏::城市,:jobtype和:contracttype如何使用Ruby-on-Rails过滤帖子

是否有一种简单的方式来创建单选按钮,以显示用户可用的选项,例如:城市伦敦,曼彻斯特,布莱顿等可以打勾显示这些特定工​​作的清单?

我是新来的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 

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

回答

0

下面是一个使用JQuery提交AJAX请求的示例(因此每次选中框时都不刷新页面)。在你看来,你为每个独特的国家创建一个复选框。 Jquery参数化选定的国家并将它们提交给你的控制器(指定你想用JavaScript做出响应)。作业模型中的作用域应用过滤器。

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

courses.coffee

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 
+0

嗨,感谢您的回复。因此,如果我不一定介意将AJAX包含在内,那么这会如何影响事物呢?因此,使用您提供的代码,我将如何更改此以适合从我上面的代码中过滤my:city,:jobtype和:contract字符串? – user2498890 2015-02-10 10:09:40

+0

您可以根据需要定义多个范围,即城市,工作类型,合同。您仍然可以像上面的代码一样生成复选框。您可以使用'link_to'来代替AJAX。有关传递参数的“Rails”方式,请参阅[本文](http://stackoverflow.com/questions/4292508/link-to-with-jquery-params-in-rails)。 – jpriebe 2015-02-10 14:37:28

+0

其中是文件index.js.erb?我有index.html.erb但不是.js.erb? – user2498890 2015-02-13 12:08:47