Проблема Rails 3 с маршрутами

#ruby-on-rails-3 #rest #routes

#ruby-on-rails-3 #rest #маршруты

Вопрос:

У меня есть ссылка на haml, которая выглядит следующим образом

 =link_to "accept", friendship, :method => :put
  

и я пытаюсь сопоставить «put» для использования действия «update» в моем контроллере

в моих маршрутах вот так

 resources :friendships do
   collection do
    get :create
    delete :destroy
    put :update
   end
 end
  

итак, если я использую метод «get», он должен получить нового друга (который работает), если я удаляю, тогда используется действие «уничтожить», и если я добавляю действие «обновить», используется действие.

Я так понимаю, что я делаю это как-то совершенно неправильно.

моя ссылка «создать» друга выглядит следующим образом

 =link_to "Add Friend", friendships_path(:friend_id => provider), :method => :post
  

и это все мои друзья.haml

 .profile
  .providers
    %h1 Other Users
    - @providers.each do |provider|
      %p
        =provider.login
        =link_to "Add Friend", friendships_path(:friend_id => provider), :method =>         
:post
  .friends
    %h1 Friends
    - @friends.each do |friendship|
      %p
        =friendship.friend.login
        =link_to "remove", friendship, :method => :delete
        =link_to "message", memos_path(:other_user => friendship.friend)

  .friends-out
    %h1 Friends Out
    - @friends_out.each do |friendship|
      %p
        =friendship.friend.login
        =link_to "remove", friendship, :method => :delete

  .friends-in
    %h1 Friends In
    - @friends_in.each do |friendship|
      %p
        =friendship.friend.login
        =link_to "remove", friendship, :method => :delete
        =link_to "accept", friendship, :method => :put
  

Ответ №1:

Да, вы почти все делаете правильно, но вы делаете это неправильно. Вы должны поступить следующим образом:

 resources :friendships
  

Ни больше, ни меньше, вот и все. Поскольку при использовании ресурсов он по умолчанию сопоставляет протокол put с действием update, протокол delete сопоставляет с действием destroy, а протокол POST сопоставляет с действием create. Потому что вы не должны использовать GET, когда база данных каким-либо образом изменена (создать, обновить, уничтожить).

И когда вы используете помощник link_to, попробуйте сделать это следующим образом:

 =link_to "accept", friendship_path(@friendship), :method => :put
  

Редактировать:

Также убедитесь, что у вас включен javascript по умолчанию для обработки указанного метода публикации:

 <%= javascript_include_tag :defaults %>
<%= csrf_meta_tag %>
  

Комментарии:

1. <%= link_to «accept», friendship, :method => :put %> будет работать, поскольку я думаю, что friendship — это объект того же класса. (Короче говоря, я думаю, что он запускает цикл)

2. да, я в кругу друзей, извините, что я упустил эту деталь

3. Да, если примером является friendship, это, конечно, сработало бы.

4. я получаю эту ошибку, когда сопоставляю ее (добавить друга), как вы это сказали? Неизвестное действие Не удалось найти действие ‘index’ для FriendshipsController

5. Происходит ли это при нажатии на ссылку, описанную выше?