1

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

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

这是应该工作的删除链接:

<%= 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 (来自应用程序/控制器)我有:

    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
    
  5. 在 routes.rb (来自配置)我有:

    resources :products
    

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)
4

2 回答 2

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

取前缀列的单词(product),将_path添加到这个单词(product_path),使用正确的方法(DELETE),将 ids 作为参数传递(在这种情况下,你可以只做product_path(@product)),然后你完成了。你将会有 :

<%= link_to "Delete", product_path(@product), method: :delete, data: { confirm: "Are you sure?" } %>
于 2013-08-01T16:10:37.373 回答
0

也许(我只是猜测,但有一天我遇到了类似的问题)如果您根据《Agile Web Development with Rails》一书设计目录或使用购物车购物,那么产品模型可能包含一个过滤器before_destroy :ensure_not_referenced_by_any_line_item,可以防止产品如果产品在 中列出,则销毁LineItems。如果是这种情况,您可以ProductsController在销毁产品之前清除 LineItems 列表。否则对不起。

于 2013-08-20T21:46:56.853 回答