我对参数的条件有问题。在我的Rails应用程序中,我在几个城市都有设施。我为每个城市准备了一张地图(使用Mapbox(,显示了该城市的所有设施。我还想有一张全世界的地图(包括标记(,但似乎没有正确获取参数 - 世界地图不起作用,或者城市地图包括整个世界,具体取决于我选择的参数。当我调查时,我(自然地(在城市地图页面上将city_id作为参数(<ActionController::Parameters {"search"=><ActionController::Parameters {"city_id"=>"2"} permitted: false>, "controller"=>"facilities", "action"=>"maps"} permitted: false>
(。在整个世界地图页面上,参数是:<ActionController::Parameters {"controller"=>"facilities", "action"=>"maps", "format"=>"#<Facility::ActiveRecord_Relation:0x00007fe5f6e32e00>"} permitted: false>
。
设施控制器中的代码:
def maps // THE COMMENTED IF-ELSE WORKS FOR CITY MAP, WORLD DOESN'T WORK
# if "city_id".present?
# @facilities = Facility.joins(:city).where(city_id: params[:search][:city_id])
# @facilities = @facilities.joins(:category).where("categories.id = ?", params[:search][:category_id]) if params[:search][:category_id].present?
# else
# @facilities = Facility.all
# end
// THE BELOW PART WORKS FOR WORLD MAP, CITY MAP GIVES WORLD MAP AS WELL
if @city.blank?
@facilities = Facility.all
else
@facilities = Facility.joins(:city).where(city_id: params[:search][:city_id])
@facilities = @facilities.joins(:category).where("categories.id = ?", params[:search][:category_id]) if params[:search][:category_id].present?
end
@markers = []
@facilities.each do |facility|
unless facility.address.blank?
map_info = render_to_string(partial: "/facilities/map_box", locals: { facility: facility })
@markers << {
lat: facility.latitude,
lng: facility.longitude,
image_url: helpers.asset_url('placemarker.png'),
infoWindow: { content: map_info }
}
end
end
authorize :facility, :map? end
If @city == nil
或@city.blank?
是我让世界地图工作的唯一方法,以及我尝试过的所有其他选项(if "city_id".blank?, unless "city_id".present?, if "city_id" == ""
...我收到错误"nil:NilClass 的未定义方法[]
",并且突出显示了@facilities = Facility.joins(:city).where(city_id: params[:search][:city_id])
行。所以似乎忽略了 if-else 中的第一个选项,我真的不明白为什么 - 城市页面只接受city_id,世界页面只接受@city。我已经尝试了 && 和 || 的各种组合并更改了两个选项的顺序,但我仍然总是只得到其中一个工作。艾维
我真的很乐意提出任何建议!如果缺少一些重要信息,我很乐意编辑我的问题。
在尝试了所有可能的条件后,我终于让它与if url.include?('city_id')
一起工作。不是最干净的方式,但至少它显示了我想要的东西。如果其他人知道如何使用参数来做到这一点,我仍然很高兴找到答案!