我的问题是我需要添加删除产品的选项以及我的库存....
首先我在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!答案 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)
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
)