如何向我的帖子索引页面添加复选框过滤器(Rails应用程序)

时间:2015-10-07 22:51:20

标签: html ruby-on-rails ruby

我有一个有许多帖子的Rails应用程序。每个Post都有不同的参数,其中两个参数是zagat_status和michelin_status。 (这是一家餐馆发现网站)。

我正在尝试添加2个复选框,允许我过滤结果:

a)zagat_status ..所以点击复选框会显示zagat_status为“是”的所有帖子 b)michelin_status ..所以点击复选框显示所有帖子michelin_status =“1”,“2”或“3”

此外,我希望这两个复选框能够相互协作。因此,如果我同时点击这两个,则两个过滤器同时适用。

然而,这不起作用......如何让下面的代码工作?

POST MODEL

class Post < ActiveRecord::Base
   scope :zagat_status, -> (zagat_status) { where zagat_status: zagat_status }
   scope :michelin_status, -> (michelin_status) { where michelin_status: michelin_status }

   validates :name, presence: true
   validates :city, presence: true
   validates :address, presence: true

   def self.search(query)
     where("name like ? OR city like ? OR address like ?", "%#{query}%", "%#{query}%", "%#{query}%")
   end

end

POST控制器

class PostsController < ApplicationController
  before_action :set_post, only: [:show, :edit, :update, :destroy]

  # GET /posts
  # GET /posts.json
  def index
    @posts = Post.all
    if params[:search]
      @posts = Post.search(params[:search]).order("created_at DESC")
    elsif params[:zagat_status].present?
      @posts = Post.zagat_status(params[:zagat_status]).order("created_at DESC")
    elsif params[:michelin_status].present?
      @posts = Post.michelin_status(params[:michelin_status]).order("created_at DESC")
    else
      @posts = Post.all
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_post
      @post = Post.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def post_params
      params.require(:post).permit(
        :name,
        :michelin_status,
        :zagat_status,
        :address,
        :city,
        :cuisine,
        :neighborhood,
        :price_range,
        :longitude,
        :latitude)
    end
end

INDEX.HTML.ERB文件(针对帖子)

  <div class="search-filter">
        <form>
          <span>Accolades</span>
          <div class="accolades-panel">
            <label>
              Michelin Star(s) <dd>1,2,3 and bibs</dd>
              <input type="checkbox" name="michelin_status" value="1">
            </label>
            <label>
              Zagat<dd>rated</dd><input type="checkbox" name="zagat_status" value="Yes">
            </label>

          </div>
        </form>
      </div>

INDEX.JS.ERB文件

空白

INDEX.JSON.JBUILDER文件

json.array!(@posts) do |post|
  json.extract! post, :id, :name, :zagat_status, :michelin_status, :cuisine, :address, :city, :price_range, :longitude, :latitude
  json.url post_url(post, format: :json)
end

1 个答案:

答案 0 :(得分:0)

您的代码不起作用,因为在满足控制器中的一个条件后立即返回结果,例如如果params [:search]存在,它将返回:

@posts = Post.search(params[:search]).order("created_at DESC")

其余代码不会被运行,因为它位于elsif块内。

这样的事情应该有效:

@posts = Post.all
if params[:search]
  @posts = @posts.search(params[:search]).order("created_at DESC")
end
if params[:zagat_status].present?
  @posts = @posts.zagat_status(params[:zagat_status]).order("created_at DESC")
end
if params[:michelin_status].present?
  @posts = @posts.michelin_status(params[:michelin_status]).order("created_at DESC")
end

这样我们就可以根据参数的存在来构建查询。然而,这不是最优雅的解决方案。

我建议你在模型中创建一个接受参数的方法,然后根据参数在那里创建一个查询。