我有一个有许多帖子的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
答案 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
这样我们就可以根据参数的存在来构建查询。然而,这不是最优雅的解决方案。
我建议你在模型中创建一个接受参数的方法,然后根据参数在那里创建一个查询。