Rails, если условие с параметрами не работает - PullRequest
0 голосов
/ 30 января 2020

У меня проблема с условием с параметрами. В моем приложении 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. Я пробовал все виды комбинаций с && и || и изменил порядок двух опций, но все равно у меня всегда работает только один из них. Ive

Буду очень рад любым предложениям! Если какая-то важная информация отсутствует, я с радостью отредактирую свой вопрос.

1 Ответ

0 голосов
/ 03 февраля 2020

После того, как я попробовал все возможные условия с параметрами, у меня наконец-то все получилось с if url.include?('city_id'). Не самый чистый способ, но, по крайней мере, он показывает то, что я хочу. Если у кого-то есть идея, как это сделать с помощью params, я все равно буду рад узнать!

...