Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 带有多个select_标记的筛选器不发送查询_Ruby On Rails_Filter_Pg Search - Fatal编程技术网

Ruby on rails 带有多个select_标记的筛选器不发送查询

Ruby on rails 带有多个select_标记的筛选器不发送查询,ruby-on-rails,filter,pg-search,Ruby On Rails,Filter,Pg Search,我有一个过滤器,你可以过滤餐厅的食物风格,价格和面积。用户可以从下拉菜单中选择样式、价格和面积,然后按过滤按钮。然而,它似乎没有过滤任何东西。例如,选择“意大利”作为风格,“欧元”作为价格,“伊维萨”作为区域,我得到以下参数: http://localhost:3000/restaurants?utf8=%E2%9C%93&tags=italian&price=%E2%82%AC%E2%82%AC&municipal=Ibiza&commit=Filter 我的表格: <%= form_t

我有一个过滤器,你可以过滤餐厅的食物风格,价格和面积。用户可以从下拉菜单中选择样式、价格和面积,然后按过滤按钮。然而,它似乎没有过滤任何东西。例如,选择“意大利”作为风格,“欧元”作为价格,“伊维萨”作为区域,我得到以下参数: http://localhost:3000/restaurants?utf8=%E2%9C%93&tags=italian&price=%E2%82%AC%E2%82%AC&municipal=Ibiza&commit=Filter

我的表格:

<%= form_tag index_ibiza_path, method: :get do %>
  <%= select_tag "tags", options_for_select([ "steakhouse", "mexican", "italian", "indian", "chinese", "thai", "french", "seafood" ]), include_blank: true %>
  <%= select_tag "price", options_for_select([ "€", "€€", "€€€"]), include_blank: true %>
  <%= select_tag "municipal", options_for_select([ "Ibiza", "Santa Eulalia del Río", "San José", "San Antonio Abad", "San Juan Bautista", "Es Caló de Sant Agustí", "San Francisco Javier", "La Savina", "Es Pujols / Sant Ferran de Ses Roques", "El Pilar de La Mola"]), include_blank: true %>
  <%= submit_tag "Filter" %>
<% end %>
如果有人能帮我。我不知道我需要做什么来解决这个问题

这就是模型:

class Restaurant < ApplicationRecord
  belongs_to :user
  has_many_attached :images
  acts_as_taggable_on :tags
  geocoded_by :address
  after_validation :geocode, if: :will_save_change_to_address?
  reverse_geocoded_by :latitude, :longitude, address: :full_address
  after_validation :reverse_geocode
  after_validation :save_city_zipcode, :assign_zipcode_to_municipal

  def save_city_zipcode
    self.zipcode = Geocoder.search([self.latitude, self.longitude]).first.data["address"]["postcode"]
  end

  def assign_zipcode_to_municipal
    case self.zipcode
    when "07800"
      return self.municipal = "Ibiza"
    when "07840", "07849"
      return self.municipal = "Santa Eulalia del Río"
    when "07817", "07818", "07829", "07830", "E-07830", "07839"
      return self.municipal = "San José"
    when "07820", "07816"
      return self.municipal = "San Antonio Abad"
    when "07240", "07810", "07815"
      return self.municipal = "San Juan Bautista"
    when "07872"
      return self.municipal = "Es Caló de Sant Agustí"
    when "07860"
      return self.municipal = "San Francisco Javier"
    when "07870"
      return self.municipal = "La Savina"
    when "07871"
      return self.municipal = "Es Pujols / Sant Ferran de Ses Roques"
    when "07872"
      return self.municipal = "El Pilar de La Mola"
    else
      return self.municipal = ""
    end
  end

  # Validations
  validates :name, presence: true, length: { minimum: 2 }
  validates :island, inclusion: { in: ["Ibiza", "Formentera"] }
  validates :price, inclusion: { in: ["€", "€€", "€€€"] }
  validates :website, format: { with: /\A(http|ftp|https)?(\:\/\/)?[\w-]+(\.[\w-]+)+([\w.,@?^!=%&amp;:\/~+#-]*[\w@?^=%&amp;\/~+#-])+$\z/,
    message: "only allows url links" } , allow_blank: true, presence: false
  validates :rating, inclusion: { in: [1, 2, 3, 4, 5] }
  validates :description, presence: true, allow_blank: false
  validates :images, attached: true, content_type: ['image/png', 'image/jpg', 'image/jpeg'], allow_blank: true, presence: false

  include PgSearch
  pg_search_scope :search_by_name_city_or_island,
      :against => [ :name, :municipal, :city, :island, :price],
      :associated_against => {
         :tags => [:name]
        },
      :using => {
        :tsearch => { :prefix => true },
        :trigram => {
          :threshold => 0.1,
          :only => [ :name, :city, :island, :municipal, :price ]
        }
      },
      :ignoring => :accents,
      :ranked_by => ":trigram"

end

在表单中,您从未为控制器提供查询参数,并且您有一个条件if params[:query].present?。您的控制器将返回:

@restaurants_ibiza = Restaurant.where.not(latitude: nil, longitude: nil).where(island: 'Ibiza')
 markers(@restaurants)
此外,我强烈建议您不要在控制器内重复查询if confirational:

class RestaurantsController < ApplicationController
  skip_before_action :authenticate_user!, only: [
    :index,
    :show,
    :featured,
    :ibiza,
    :formentera,
    :restaurant_ibiza,
    :beach_restaurant_ibiza,
    :cafe_ibiza,
    :restaurant_formentera,
    :beach_restaurant_formentera,
    :cafe_formentera,
    :tagged,
    :index_ibiza,
    :index_formentera
  ]
  before_action :set_restaurant, only: [ :show, :edit, :update, :destroy ]

  def index
    if params[:query].present?
      if @restaurants = Restaurant.where.not(latitude: nil, longitude: nil).search_by_name_city_or_island(params[:query]).present?
        @restaurants = Restaurant.where.not(latitude: nil, longitude: nil).search_by_name_city_or_island(params[:query])
        markers(@restaurants)
      else
        render :no_results_search
      end
    else
      @restaurants = Restaurant.where.not(latitude: nil, longitude: nil).all.order(:name)
      markers(@restaurants)
    end
  end

  def index_ibiza
    @restaurants_ibiza = Restaurant.where.not(latitude: nil, longitude: nil).where(island: 'Ibiza').search_by_name_city_or_island(params[:query])
    if @restaurants_ibiza
      markers(@restaurants)
    else
      render :no_results
    end
  end

  def index_formentera
    @restaurants_formentera = Restaurant.where.not(latitude: nil, longitude: nil).where(island: 'Formentera').search_by_name_city_or_island(params[:query])
    if @restaurants_formentera.present?
      @restaurants_formentera
      markers(@restaurants)
    else
      render :no_results
    end
  end

  def ibiza
    @restaurants = Restaurant.where(featured: true)
    @ibiza_town = Restaurant.where(zipcode: "07800") || Restaurant.where(geo_city: 'Ibiza Town')
    @santa_eulalia = Restaurant.where(zipcode: ["07840", "07849"])
    @san_jose = Restaurant.where(zipcode: ["07817", "07818", "07829", "07830", "E-07830", "07839"])
    @san_antonio = Restaurant.where(zipcode: ["07820", "07816"])
    @san_juan = Restaurant.where(zipcode: ["07240", "07810", "07815"])
  end

  def restaurant_ibiza
    results_ibiza(@restaurants)
  end

  def beach_restaurant_ibiza
    results_ibiza(@restaurants)
  end

  def cafe_ibiza
    results_ibiza(@restaurants)
  end

  def formentera
    @restaurants = Restaurant.where(featured: true)
    @es_calo = Restaurant.where(zipcode: ["07872"])
    @san_francisco = Restaurant.where(zipcode: ["07860"])
    @la_savina = Restaurant.where(zipcode: ["07870"])
    @es_pujols_sant_ferran = Restaurant.where(zipcode: ["07871"])
    @el_pilar = Restaurant.where(zipcode: ["07872"])
  end

  def restaurant_formentera
    results_formentera(@restaurants)
  end

  def beach_restaurant_formentera
    results_formentera(@restaurants)
  end

  def cafe_formentera
    results_formentera(@restaurants)
  end

  def featured
    @restaurants = Restaurant.where(featured: true)
  end

  def tagged
    if params[:tag].present?
      @restaurants = Restaurant.tagged_with(params[:tag])
      markers(@restaurants)
    else
      @restaurants = Restaurant.where.not(latitude: nil, longitude: nil).all.order(:name)
      markers(@restaurants)
    end
  end

  def show
    @related_restaurants = @restaurant.find_related_tags
    @markers = [{
      lng: @restaurant.longitude,
      lat: @restaurant.latitude,
      infoWindow: { content: render_to_string(partial: "/restaurants/map_window", locals: { restaurant: @restaurant }) }
    }]
  end

  def new
    @restaurant = Restaurant.new
  end

  def create
    @restaurant = Restaurant.new(restaurant_params)
    @restaurant.user = current_user
    if @restaurant.save
      redirect_to restaurant_path(@restaurant)
    else
      render :new
    end
  end

  def edit
  end

  def update
    if @restaurant.update(restaurant_params)
      redirect_to restaurant_path(@restaurant)
    else
      render :edit
    end
  end

  def destroy
    @restaurant.destroy
    redirect_to restaurants_path
  end

  private

  def set_restaurant
    @restaurant = Restaurant.find(params[:id])
  end

  def results_ibiza(restaurants)
    if @restaurants = Restaurant.where.not(latitude: nil, longitude: nil).where(island: 'Ibiza').where(category: params[:query]).present?
      @restaurants = Restaurant.where.not(latitude: nil, longitude: nil).where(island: 'Ibiza').where(category: params[:query])
      markers(@restaurants)
    else
      render :no_results
    end
  end

  def results_formentera(restaurants)
    if @restaurants = Restaurant.where.not(latitude: nil, longitude: nil).where(island: 'Formentera').where(category: params[:query]).present?
      @restaurants = Restaurant.where.not(latitude: nil, longitude: nil).where(island: 'Formentera').where(category: params[:query])
      markers(@restaurants)
    else
      render :no_results
    end
  end

  def markers(restaurants)
    if @restaurants
      @markers = @restaurants.map do |restaurant|
        {
         lng: restaurant.longitude,
         lat: restaurant.latitude,
         infoWindow: { content: render_to_string(partial: "/restaurants/map_window", locals: { restaurant: restaurant }) }
        }
      end
    elsif @restaurants_ibiza
      @markers = @restaurants_ibiza.map do |restaurant|
        {
         lng: restaurant.longitude,
         lat: restaurant.latitude,
         infoWindow: { content: render_to_string(partial: "/restaurants/map_window", locals: { restaurant: restaurant }) }
        }
      end
    else
       @markers = @restaurants_formentera.map do |restaurant|
        {
         lng: restaurant.longitude,
         lat: restaurant.latitude,
         infoWindow: { content: render_to_string(partial: "/restaurants/map_window", locals: { restaurant: restaurant }) }
        }
      end
    end
  end

  def restaurant_params
    params.require(:restaurant).permit(
      :name,
      :address,
      :full_address,
      :zipcode,
      :phone,
      :email,
      :facebook,
      :instagram,
      :twitter,
      :website,
      :city,
      :island,
      :featured,
      :active,
      :style,
      :price,
      :rating,
      :longitude,
      :latitude,
      :description,
      :opening_hours_morning,
      :closing_hours_morning,
      :opening_hours_afternoon,
      :closing_hours_afternoon,
      tag_list: [],
      images: []
      )
  end
end
if @restaurants_ibiza = Restaurant.where.not(latitude: nil, longitude: nil).where(island: 'Ibiza').search_by_name_city_or_island(params[:query]).present?
    @restaurants_ibiza = Restaurant.where.not(latitude: nil, longitude: nil).where(island: 'Ibiza').search_by_name_city_or_island(params[:query])
您可以执行以下操作:

@restaurants = Restaurant.where.not(latitude: nil, longitude: nil).where(island: 'Ibiza').search_by_name_city_or_island(params[:query])
if @restaurants
  markers(@restaurants)
else
  render :no_result
end

对于html,您应该使用options for collect,请参见:

,因此我在一些帮助下发现问题在于我忘记了将表单中的方法更改为post方法。使用get方法时,控制器不会以其他方式接收它。我还让控制器根据表单上的名称获取每个参数。因此,为了向您展示我所做的事情,下面是我现在如何拥有控制器:

def index_ibiza
    if params[:tags].present?
      @restaurants = Restaurant.where.not(latitude: nil, longitude: nil).where(island: 'Ibiza').search_by_name_city_or_island(params[:tags])
      markers(@restaurants)
    elsif params[:price].present?
      @restaurants = Restaurant.where.not(latitude: nil, longitude: nil).where(island: 'Ibiza').search_by_name_city_or_island(params[:price])
      markers(@restaurants)
    elsif params[:municipal].present?
      @restaurants = Restaurant.where.not(latitude: nil, longitude: nil).where(island: 'Ibiza').search_by_name_city_or_island(params[:municipal])
      markers(@restaurants)
    else
      @restaurants = Restaurant.where.not(latitude: nil, longitude: nil).where(island: 'Ibiza').order(:name)
      markers(@restaurants)
    end
  end
你看,我在表格上用名字给每个参数命名。下面是表单的外观:

<div class="container index-container content" style="margin-bottom: 0px;">
  <div class="row">
    <div class="col-sm-12">
      <form action="" class="form-inline">
        <div class="form-group">
          <%= form_tag index_ibiza_path, method: :post do %>
            <%= select_tag :tags, options_for_select([ "steakhouse", "mexican", "italian", "indian", "chinese", "thai", "french", "seafood" ]), include_blank: true %>
            <%= select_tag :price, options_for_select([ "€", "€€", "€€€"]), include_blank: true %>
            <%= select_tag :municipal, options_for_select([ "Ibiza", "Santa Eulalia del Río", "San José", "San Antonio Abad", "San Juan Bautista", "Es Caló de Sant Agustí", "San Francisco Javier", "La Savina", "Es Pujols / Sant Ferran de Ses Roques", "El Pilar de La Mola"]), include_blank: true %>
            <%= submit_tag "Filter" %>
          <% end %>
        </div>
      </form>
    </div>
  </div>
</div>
所以我在其他索引上做了同样的事情:

ibiza_索引:用户点击island=>ibiza,foodstyle=>chinese时到达的位置在ibiza+chinese上过滤结果 ibiza_餐厅/_海滩_餐厅/_咖啡厅:当用户单击island=>ibiza,餐厅类型=>餐厅或海滩餐厅或咖啡厅时,用户到达的位置。结果在ibiza+餐厅或_海滩_餐厅或_咖啡厅上过滤 formentera_索引:请参阅ibiza_索引,但island=>formentera formentera_餐厅:见ibiza_餐厅,但岛=>formentera 用户在导航栏上搜索表单的文本字段中立即键入搜索查询时到达的普通索引页
特别感谢Ruby on Rails开发者fb小组的@Dimitrius Lachi和@Chiel Hackman对我的帮助。

谢谢你的建议。我已经在我的rails应用程序中实现了它,但迄今为止它没有改变任何事情。我已经编辑了上面的解释,把我所有的都包括进去了。这个应用程序变得有点复杂了,因为我有一个针对Ibiza的索引和一个针对Formentera 2个不同岛屿的索引,以及一个针对这两个岛屿的普通索引。我有一种预感,当使用过滤器时,这些索引以某种方式相互干扰。我感谢你的意见。
<div class="container index-container content" style="margin-bottom: 0px;">
  <div class="row">
    <div class="col-sm-12">
      <form action="" class="form-inline">
        <div class="form-group">
          <%= form_tag index_ibiza_path, method: :post do %>
            <%= select_tag :tags, options_for_select([ "steakhouse", "mexican", "italian", "indian", "chinese", "thai", "french", "seafood" ]), include_blank: true %>
            <%= select_tag :price, options_for_select([ "€", "€€", "€€€"]), include_blank: true %>
            <%= select_tag :municipal, options_for_select([ "Ibiza", "Santa Eulalia del Río", "San José", "San Antonio Abad", "San Juan Bautista", "Es Caló de Sant Agustí", "San Francisco Javier", "La Savina", "Es Pujols / Sant Ferran de Ses Roques", "El Pilar de La Mola"]), include_blank: true %>
            <%= submit_tag "Filter" %>
          <% end %>
        </div>
      </form>
    </div>
  </div>
</div>