ошибка маршрутизации: передача параметра действию в контроллере

Краткое изложение моей модели: у пользователя много встреч. Встреча имеет много заказов. Бронирование относится к встрече.

Я пытаюсь связать_с конкретным представлением (называемым «users_bookings»), в котором перечислены все бронирования для определенной встречи. Вот что я пробовал:

<% current_user.appointments.each do |appointment|%>
    <%= link_to "view all bookings", users_bookings_appointment_booking_path(appointment)%>
<%end%>

Это ошибка, которую я получаю:

undefined method `users_bookings_appointment_bookings'

Дополнительная информация:

Маршруты:

resources :appointments do
    resources :bookings do
      get 'users_bookings', :on => :collection
    end        
  end

Контроллер бронирования создает действие:

def create
    @appointment = Appointment.find(params[:booking][:appointment_id])
    @booking = @appointment.bookings.new(params[:booking])

Контроллер бронирований Users_bookings Действие:

def users_bookings
    @appointment = Appointment.find(params[:booking][:appointment_id])
    @bookings = @appointment.bookings.all
end

Представление Users_bookings:

<% @bookings.each do |booking| %>
    <td><%= booking.appointment_date%></td>
    <td><%= booking.start_time %></td>
    <td><%= booking.end_time %></td>
<%end%>

person Benamir    schedule 03.10.2012    source источник


Ответы (3)


Вы не должны использовать match (как предлагали другие), если вы действительно не хотите сопоставлять все HTTP-запросы (GET, POST и т. д.) для этого URL-адреса. Вместо этого просто добавьте маршрут к ресурсу в блоке do:

resources :appointments do
  resources :bookings do
    get 'user_bookings', :on => :collection
  end
end

Это добавит дополнительный маршрут для запроса GET к `/appointments/:appointment_id/bookings/user_bookings' и направит его к 'bookings#user_bookings'.

person Chris Salzberg    schedule 03.10.2012
comment
Спасибо. Помощь очень ценится. - person Benamir; 04.10.2012

Я бы изменил его на индексное действие контроллера бронирования. Таким образом, он будет соответствовать «/appointments/1/bookings».

Однако, если есть причина, по которой вы не можете этого сделать, так как это не один из стандартных маршрутов, вам необходимо указать его в файле route.rb. Что-то вроде:

match '/appointments/:id/bookings/users_bookings' => 'bookings#users_bookings'
person mccarths    schedule 03.10.2012
comment
Спасибо. Помощь очень ценится. - person Benamir; 04.10.2012

Вы пытались определить собственный маршрут, который указывает на определенное действие в вашем контроллере, например:

match 'appointments/:id/users_bookings' => 'bookings#users_bookings', :as => :users_bookings

Находчивые маршруты просто избавляют вас от бремени ввода стандартных маршрутов для CRUD-действий, но могут быть расширены с помощью настраиваемых маршрутов, например, если вы хотите предложить ссылку для загрузки PDF или CSV экспорта объекта ресурса

затем вы можете использовать users_bookings_path в файле просмотра, чтобы указать на действие

person jethroo    schedule 03.10.2012
comment
Спасибо. Помощь очень ценится. - person Benamir; 04.10.2012