#ruby-on-rails #ruby #model-view-controller #routing
#ruby-on-rails #ruby #модель-представление-контроллер #маршруты
Вопрос:
Вероятно, это очень простой вопрос. Я новичок в Rails и только что столкнулся с первым серьезным препятствием. У меня есть два контроллера, Groups и MembershipRequests. Когда кто-то отправляет MembershipRequest, администратор группы имеет возможность принять или отклонить запрос. В моем контроллере MembershipRequests у меня есть два метода: accept и deny. Они оба работают, но теперь я не уверен, что справлюсь со своими маршрутами.
Это соответствующая часть моих маршрутов.rb:
resources :groups do
member do
get 'members'
resources :membership_requests do
member do
post 'accept'
post 'deny'
end
end
...
end
end
Хорошо, перейдем к моему реальному вопросу: я хочу иметь возможность принимать и отклонять запросы без дополнительной страницы. Я хочу использовать JavaScript для использования кнопки на моей индексной странице MembershipRequests, где администратор может принимать или отклонять запросы.
Вот мой erb-код для кнопок accept и deny:
<%= link_to "Accept", :controller => 'membership_requests', :action => 'accept', :confirm => 'Are you sure?' %>
<%= link_to "Deny", :controller => 'membership_requests', :action => 'deny', :confirm => 'Are you sure?' %>
Нажатие на любую из этих ссылок дает мне No route matches "/groups/1/membership_requests/1/{accept,deny}"
именно то, что я ожидал. Но я не знаю, как это обойти. Спасибо!
Комментарии:
1. как выглядит контроллер? вы, вероятно, просто хотите redirect_to в конце, чтобы не было необходимости в представлении
2. Пожалуйста, используйте предоставленные вам помощники по маршрутизации вместо хэшей, содержащих
:controller
и:action
ключи для ваших ссылок.3. Чтобы добавить к ответу Райана Бигга, вы можете использовать
rake routes
, чтобы узнать, какие маршруты доступны. Способ, которым вы написали ссылки здесь, соответствует стилю Rails 2.x.
Ответ №1:
Я думаю, link_to
также должен иметь :method => :post
, потому что вы сопоставляете его пользовательскому (не RESTful) действию (это всего лишь предположение) и :remote => true
, чтобы сообщить rails, что эта ссылка использует ненавязчивый JS.
Этот скринкаст может помочь или, по крайней мере, дать отправную точку.
О, и да. Как предлагает Райан, вам лучше использовать что-то вроде этого:
@requests.each do |request|
link_to "Accept", membership_request_accept_path(request), :confirm => 'Are you sure?', :remote => true
end
Комментарии:
1. Спасибо за ссылку на этот скринкаст, это на самом деле то, что помогло мне начать этот путь, но позже я не смог его найти! Кроме того, спасибо за код, который тоже действительно помог.