【问题标题】:adding delete option for product rails member routes为产品导轨成员路线添加删除选项
【发布时间】:2014-05-03 20:33:04
【问题描述】:

我的问题是我需要添加删除产品的选项,并且我有库存....

首先我在 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)%>

但我现在不知道“method: :delete”和“if can? (:destroy, product)”之间的区别是什么,destroy 是我猜测并删除的控制器动作吗?不知道……

另一件事是我对该操作的控制器定义:

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

但当我按下“删除”时,它不会重定向到 product_path

我的路线定义如下:

resources products do 
    member do
        get :destroy
    end
end

我将非常感谢任何帮助,

感谢您的宝贵时间:D!

【问题讨论】:

    标签: ruby-on-rails ruby routes


    【解决方案1】:

    是的,destroy是控制器的delete方法,要重定向到产品列表页面你应该使用redirect_to action: 'index'。可以通过命令rake routes查看所有动作和方法

    【讨论】:

      【解决方案2】:

      你应该redirect_to products_path(这转换为index
      因为目前它说redirect_to product path(转换为show)这将引发错误
      method: :delete用于发布到destroy action 和 can?Ryan Batescancan gem 方法。 if 检查用户是否有权删除产品。

      权限可以在app/models/ability.rb中设置

      最后将路线更改为:

      resources: :products
      

      【讨论】:

        【解决方案3】:

        destroy 操作必须在 HTTP 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 会将您重定向到productsindex 页面。 正如product_path 用于show,即显示特定产品。如果不向product_path 提供id,您也无法显示已删除的产品。因此,从逻辑上讲,您应该使用products_url 重定向到index 操作(注意使用**_url 进行重定向是可取的,但您也可以使用products_path

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-10-06
          • 2015-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-30
          • 1970-01-01
          相关资源
          最近更新 更多