为产品rails成员路由添加删除选项

时间:2014-05-03 20:33:05

标签: ruby-on-rails ruby routes

我的问题是我需要添加删除产品的选项以及我的库存....

首先我在index.html.erb中添加了这一行:

<% glyph_to "Delete", product, method: :delete, data: (confirm: "Are you sure that product" ##(product.id) is not used?") if can? (:destroy, product)%>

但我现在不知道&#34;方法:: delete&#34;之间的区别是什么?和&#34;如果可以的话? (:destroy,product)&#34;,destroy是我猜的控制器动作并删除?我不知道......

另一件事是我对该行动的控制器定义:

def destroy 
    @product = Product.find(params[:id])
    @product.destroy
    redirect_to product_path
end

但是当我按下&#34;删除&#34;它没有重定向到product_path

我的路线定义如下:

resources products do 
    member do
        get :destroy
    end
end

我将非常感谢任何帮助,

谢谢你的时间:D!

3 个答案:

答案 0 :(得分:4)

是的,destroy是控制器的删除方法,要重定向到您应该使用redirect_to action: 'index'的产品列表页面。您可以通过命令rake routes

检查所有操作和方法

答案 1 :(得分:4)

您应该redirect_to products_path(这会转换为index
因为当前它会显示redirect_to product path(转换为show),这会引发错误
method: :delete用于发布destroy行动,can? Ryan Bates cancan gem方法。 if检查用户是否具有删除产品的权限。

权限可以在app/models/ability.rb中设置 最后将您的路线更改为:

resources: :products

答案 2 :(得分:2)

必须在HTTP destroy请求上调用

DELETE操作,而不要在GET上调用。您绝对应该从您的路线中修复以下代码:

resources products do  ## missing : here, it should be :products
  ## member block not required
  member do  
      get :destroy  ## destroy should never be GET request
  end
end

您只需将路线定义为:

resources :products ## Notice :products and not products

这将为您生成以下路线,您可以通过运行命令rake routes

来检查
         products GET    /products(.:format)                   products#index
                  POST   /products(.:format)                   products#create
      new_product GET    /products/new(.:format)               products#new
     edit_product GET    /products/:id/edit(.:format)          products#edit
          product GET    /products/:id(.:format)               products#show
                  PATCH  /products/:id(.:format)               products#update
                  PUT    /products/:id(.:format)               products#update
                  DELETE /products/:id(.:format)               products#destroy

注意生成的最后一条路线。 应将destroy操作称为HTTP Delete方法,这就是为什么在您的链接上需要将method: :delete指定为

<% glyph_to "Delete", product, method: :delete, data: (confirm: "Are you sure that product" ##(product.id) is not used?") if can? (:destroy, product)%>

因此,当您点击此链接时,会发送DELETE请求,该请求将映射到products#destroy的路由,即

   DELETE /products/:id(.:format)               products#destroy

此外,您需要更新destroy操作,如下所示:

def destroy 
    @product = Product.find(params[:id])
    @product.destroy
    redirect_to products_url  ## products_url notice plural products
end

products_url会将您重定向到index的{​​{1}}页面。 products代表product_path,即展示特定产品。您无法向show id提供product_path,也无法显示已删除的商品。因此,从逻辑上讲,您应该使用index重定向到products_url操作(注意使用**_url进行重定向是可取的,但您也可以使用products_path