0

我无法找到销毁记录的正确方法。我觉得自己像一个完整的新手。

以下是与控制器有关的路线(来自 的输出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>

有人能发现我在这里做错了吗?:-/


编辑

我最初没有加载 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>
4

2 回答 2

4

URL 看起来相同,因为它是相同的。不同之处在于请求方法。您的 Rails 应用程序知道将GET,PUTDELETE请求分开——即使它们是针对相同的 URL 发出的——并将请求路由到正确的操作。

但是,并非所有浏览器/Web 服务器都支持所有这些方法,因此 Rails 依靠不显眼的 JavaScript (ujs) 来“伪造”一些请求——更具体地说PUTDELETE. 因此,您需要包含 Rails 应用程序的捆绑包之一(Prototype 默认提供;您可以通过此 gem获取jQuery 版本)。您可以通过 jQuery ujs 的 README(当然还有源代码)了解更多信息。

如果您遇到问题,可能是因为您没有必要的 ujs。也可能是csrf_meta_tag您的 html 标头中没有包含 。

于 2011-02-03T04:02:10.437 回答
2

一些事情可能会出错,但是如果没有更多关于您拥有什么以及您得到什么错误/行为的信息,就很难缩小范围。

  1. 您没有加载 rails.js,因此data-method="delete"没有发送_method参数设置为“删除”的 AJAX 帖子的效果。
  2. 您的destroy控制器操作没有达到您的预期。
  3. content不是引用您尝试破坏的模型实例的局部变量(请注意,content_path如果这是您尝试破坏的单一资源,您只会使用单数)。您是否正在寻找@content相反的东西?没有上下文就很难说。

只是为了澄清一下,method选项是 HTTP 方法,而不是控制器方法。没有destroyHTTP方法;Rails 只是将destroyoverdelete用作一种“优雅地删除”。

于 2011-02-03T03:58:15.440 回答