Настройка маршрутов в RoR v3 без просмотров, только JavaScript?

#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. Спасибо за ссылку на этот скринкаст, это на самом деле то, что помогло мне начать этот путь, но позже я не смог его найти! Кроме того, спасибо за код, который тоже действительно помог.