Rails - не могу понять, как уничтожить запись - PullRequest
0 голосов
/ 03 февраля 2011

Я не могу найти правильный способ уничтожить запись.Я чувствую себя таким полным новичком.

Вот маршруты, относящиеся к контроллеру (вывод из rake routes):

    contents GET    /admin/contents(.:format)                   {:controller=>"contents", :action=>"index"}
    contents POST   /admin/contents(.:format)                   {:controller=>"contents", :action=>"create"}
 new_content GET    /admin/contents/new(.:format)               {:controller=>"contents", :action=>"new"}
edit_content GET    /admin/contents/:id/edit(.:format)          {:controller=>"contents", :action=>"edit"}
     content GET    /admin/contents/:id(.:format)               {:controller=>"contents", :action=>"show"}
     content PUT    /admin/contents/:id(.:format)               {:controller=>"contents", :action=>"update"}
     content DELETE /admin/contents/:id(.:format)               {:controller=>"contents", :action=>"destroy"}

Что меня привлекает, так это то, что нижняя строка не выглядитотличается от get и put.

Вот ссылка:

<%= link_to 'Destroy', content, :confirm => 'Are you sure?', :method => :delete %>

также пробовал:

<%= link_to 'Destroy', content, :confirm => 'Are you sure?', :method => :destroy %>

и вывод:

<a href="/admin/contents/1400" data-confirm="Are you sure?" data-method="destroy" rel="nofollow">Destroy</a>

Может кто-то заметит, что я здесь делаю неправильно?: - /


edit

У меня изначально не было загрузки rails.js.Я делаю сейчас.

Вот содержимое моего действия уничтожения:

def destroy
  @content = Content.find(params[:id])
  @content.destroy

  respond_to do |format|
    format.html { redirect_to(contents_url) }
    format.xml  { head :ok }
  end
end

Я удаляю из индекса содержимого, вот так:

<% @contents.each do |content| %>
  <tr>
    <td><%= content.name %></td>
    <td><%= link_to 'Show', content %></td>
    <td><%= link_to 'Edit', edit_content_path(content) %></td>
    <td><%= link_to 'Destroy', content, :confirm => 'Are you sure?', :method => :destroy %></td>
  </tr>
<% end %>
</table>

Ответы [ 2 ]

4 голосов
/ 03 февраля 2011

URL выглядит одинаково, потому что он одинаковый. Разница заключается в методе запроса . Ваше приложение Rails знает, как разделять запросы GET, PUT и DELETE - даже если они направлены на один и тот же URL-адрес - и направлять запрос к нужному действию.

Однако не все браузеры / веб-серверы поддерживают все эти методы, поэтому Rails полагается на ненавязчивый JavaScript (ujs) для «подделки» некоторых запросов - точнее, PUT и DELETE. Из-за этого вам нужно будет включить один из комплектов для приложений Rails (по умолчанию поставляется Prototype; вы можете получить эту версию jQuery *1011* - этого гема ). Вы можете узнать больше через README (и, конечно, источник) jjuery ujs.

Если у вас возникли проблемы, возможно, это потому, что у вас нет необходимых UJS. Возможно также, что вы не включили csrf_meta_tag в заголовок html.

2 голосов
/ 03 февраля 2011

Некоторые вещи могут пойти не так, но трудно сузить круг без дополнительной информации о том, что у вас есть и какие ошибки / поведение вы получаете.

  1. У вас нет рельсов.js загружается, следовательно, data-method="delete" не имеет эффекта отправки сообщения AJAX с аргументом _method, установленным на "удалить".
  2. Ваше действие контроллера destroy не выполняет то, что вы ожидаете.
  3. content не является локальной переменной, ссылающейся на экземпляр модели, которую вы пытаетесь уничтожить (обратите внимание, чтовы бы использовали единственное число content_path, если бы это был единственный ресурс, который вы пытались уничтожить).Вы ищете @content вместо этого, может быть?Трудно сказать без какого-либо контекста.

И, чтобы уточнить, опция method - это метод HTTP, а не метод контроллера.Нет destroy метода HTTP;Rails просто использует destroy over delete как своего рода «изящное удаление».

...