为什么破坏/删除链接不起作用?

时间:2013-08-01 14:41:12

标签: ruby-on-rails destroy

我被困在删除/毁灭中。任何帮助将不胜感激!

我在Mac 10.8.3上使用Ruby 2.0.0和Rails 3.2.6与Postgres。

这是应该起作用的删除链接:

<%= link_to 'Destroy', @product, method: :delete, data: { confirm: 'Are you sure?' } %>

但是当我点击Destroy链接时,它会将我引导到用户的个人资料中。我没有得到任何确认窗口,也没有进行任何操作(删除)。它似乎只是停留在同一页面。我正在使用Firefox,但在IE和Chrome中是相同的。

这就是我所拥有的:

  1. 安装了宝石“jquery-rails”

  2. applications.js(来自app / assets / javascripts)有以下几行:

    //= require jquery
    //= require jquery_ujs
    //= require_tree .
    
  3. application.html.erb(来自app / views / layouts)有以下几行:

    <%= javascript_include_tag "application" %>
    <%= csrf_meta_tags %>
    

    在视图来源中,我看到:

    <script src="/assets/application.js?body=1" type="text/javascript"></script>
    <meta content="authenticity_token" name="csrf-param" />
    <meta content="MVlJi+WJE1cwWoHnBrpRWIa13gqio0iPT3IL6kpQYdE=" name="csrf-token" />
    
  4. products_controllers.rb中的
  5. (来自app / controllers)我有:

    def destroy
        @product = Product.where(:id => params[:id]).first
        @product.destroy
    
        respond_to do |format|
            format.html { redirect_to products_url }
            format.json { head :no_content}
        end
    end
    
  6. routes.rb中的
  7. (来自配置)我有:

    resources :products
    
  8. Destroy链接有什么问题?

    在同一个RoR项目中,编辑链接正常工作。

    那么,为什么链接不起作用?这是一个Javascript问题还是其他一些我没有看到的问题?

    这是服务器的日志:(似乎“删除”操作没有执行)

    Started GET "/products/9" for 127.0.0.1 at 2013-08-01 20:01:08 -0500
    Processing by ProductsController#show as HTML
    Parameters: {"id"=>"9"}
    Product Load (0.1ms)  SELECT "products".* FROM "products" WHERE "products"."id" = 9 LIMIT 1
    Rendered products/show.html.erb within layouts/application (0.5ms)
    Completed 200 OK in 27ms (Views: 25.8ms | ActiveRecord: 0.1ms)
    

2 个答案:

答案 0 :(得分:0)

使用Rails处理路径问题的一种有用方法是在控制台中键入“rake routes”,以便列出可用于资源的所有路径。

通过在routes.rb文件中声明“resources:products”,“rake routes”将提供此特定资源的Prefix / Verb / URI Pattern / Controller#Action列表。你会有类似的东西:

Prefix  Verb   URI Pattern
product GET    /product/:id(.:format) product#show
        PATCH  /product/:id(.:format) product#update
        DELETE /product/:id(.:format) product#destroy

使用前缀列(产品),将 _path 添加到此单词( product_path ),使用正确的方法(< strong> DELETE ),将ids作为参数传递(在这种情况下,您可以执行 product_path(@product)),然后就完成了。你将拥有:

<%= link_to "Delete", product_path(@product), method: :delete, data: { confirm: "Are you sure?" } %>

答案 1 :(得分:0)

也许(我只是猜测,但有一天我遇到了类似的问题)如果你根据Agile Web Development with Rails这本书设计产品目录或购物车,产品型号可能包含过滤器{{如果产品列在before_destroy :ensure_not_referenced_by_any_line_item中,则会阻止产品销毁。如果是这种情况,您可以在销毁产品之前清除LineItems中的LineItem列表。否则抱歉。