Маршрутизация к различным экземплярам индекса с использованием вспомогательного метода - PullRequest
0 голосов
/ 25 июня 2019

У меня есть контроллер под названием BookingsController с действием bookings # index. Внутри действия index есть 2 переменных экземпляра, @pending_bookings и @approved_bookings, которые запрашивают объекты Booking по их status.

 def index
     @pending_bookings = Booking.where(host_id:@user.id, 
    status:'pending') 
     @approved_bookings = Booking.where(host_id:@user.id, 
    status:'approved')
 end 

Я хочу направить пользователя к другому экземпляру индекса в зависимости от ссылки, по которой он щелкает. В основном bookings_path(@pending_bookings) должен направить пользователя на страницу индекса, отображающую все pending_bookings, отрицательно, bookings_path(@approved_bookings) должен направить пользователя на страницу индекса, отображающую все approved_bookings.

На мой взгляд, у меня есть 2 ссылки, которые должны направлять пользователя на каждый путь соответственно.

 <%= link_to 'Pending Reservations', bookings_path(@pending_bookings)%>
 <%= link_to 'Approved Reservations', bookings_path(@approved_bookings)%> `

Файл index.html.erb:

  <%= booking_index_helper_path %> 

содержит встроенный вспомогательный метод, который должен распознавать путь, по которому щелкает пользователь, и отображать правильные объекты Booking.

Вот (ошибочная) логика для распознавания пути, выбранного пользователем, и рендеринга необходимых объектов:

pages_helper.rb:

 def booking_index_helper_path
    if bookings_path(@pending_bookings)
      render @pending_bookings
    elsif bookings_path(@approved_bookings)
      render @approved_bookings
    else bookings_path(@total_bookings)
      @total_bookings
    end
 end

Я вставил binding.pry в вспомогательный метод, чтобы подтвердить, что его ударили (это так). Однако по какой-то причине, когда я нажимаю на ссылку, чтобы направить меня к нужным объектам, первое условие всегда выполняется. Как лучше написать это условие для распознавания пути, выбранного пользователем?

1 Ответ

3 голосов
/ 26 июня 2019

Похоже, вы делаете это более сложным способом, чем нужно. Почему бы просто не иметь индекс вроде:

 def index
   #Rails autoescapes this string so no fear of sql injection using user supplied strings
   @bookings = Booking.where(host_id:@user.id, status: "#{params[:status]}")
 end

Тогда используйте ссылку как:

 <%= link_to 'Pending Reservations', bookings_path(status: 'pending')%>
 <%= link_to 'Approved Reservations', bookings_path(status: 'approved')%> `

Теперь ваше представление может просто обрабатывать @bookings и не заботиться о типах @bookings, как это делает логика в вашем контроллере. Это минимальный минимум, но вы должны привыкнуть добавлять сообщения об ошибках и т. Д. В свои контроллеры, поэтому подумайте о следующем:

 def index
   if params[:status].present?
     #Rails autoescapes this string so no fear of sql injection using user supplied strings
     @bookings = Booking.where(host_id:@user.id, status: "#{params[:status]}")
     flash[:success] = "#{params[:status].titleize} Bookings loaded."
     redirect_to whatever_path
   else
     flash[:error] = "Something went wrong"
     redirect_to some_path
   end
 end
...