Именованные маршруты: почему не работает destroy_message_path? - PullRequest
0 голосов
/ 17 марта 2011

У меня есть ссылка типа

  <a href = '/messages/destroy/<%= @showmessage.id %>'>Delete Message</a>

Я переписываю это в

  <%= link_to "Delete Message", destroy_message_path(:id => "1") %>

В моих маршрутах у меня есть

   map.resources :messages, :collection => { :destroy => :get }

И в моем контроллере

   def destroy
     @message = Message.find(params[:id])
     @message.destroy
     redirect_to :action => 'index'
   end

Когда я запускаю страницу, я получаю сообщение об ошибке:

 undefined method `destroy_message_path' for #<ActionView::Base:0xb24a24c0>

Как мне решить эту проблему?

Ответы [ 2 ]

1 голос
/ 17 марта 2011

Я не уверен, что вы хотите бороться с конвенциями Rails здесь, но с ними гораздо проще согласиться, поэтому, если вы согласны с этим, вы можете сделать следующее:

Удалите это из ваших маршрутов:

map.resources :messages, :collection => { :destroy => :get }

Измените его на:

map.resources :messages

И используйте вместо этого этот формат ссылки:

<%= link_to "Delete Message", message_path(:id => "1"), :method => 'delete' %>

URL для разрушающего действия будет выглядеть как /messages/1, но часть «method» этого метода link_to заставит Rails создать скрытую форму и выполнить симулированное действие «DELETE» для URL. Что гораздо более RESTful, и следует тому, что Rails ожидает от вас.

0 голосов
/ 17 марта 2011

С ресурсами вы не должны делать запрос GET, вы должны делать запрос DELETE, как это:

<%= link_to "Delete Message", destroy_message_path(:id => "1"),
            :confirm => 'Are you sure?', :method => :delete %>

и в вашем файле маршрутов:

map.resources :messages

В другой заметке вы можете просто передать объект сообщения в destroy_message_path, например:

<%= link_to "Delete Message", destroy_message_path(@message),
            :confirm => 'Are you sure?', :method => :delete %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...