代码之家  ›  专栏  ›  技术社区  ›  calyxofheld

ActiveRecord::RecordNotFound“没有id找不到”

  •  0
  • calyxofheld  · 技术社区  · 7 年前

    我有一个方法可以切换布尔值,但由于ActiveRecord not found错误,无法使它在控制器级别工作。

    我的 items_controller.rb

    def remove
     @item = Item.friendly.find(params[:id])
     respond_to do |format|
      if @item.toggle_approved
       format.html { redirect_to root_path }
      else
       format.html { render :show }
      end
     end
    end
    

    当我像这样设置实例变量时- @item = Item.friendly.find(params[:id]) -我有个错误说 Couldn't find Item without an ID . 但是当我这样设置的时候- @item = Item.find(params[:id]) -我有个错误说 Couldn't find Item with 'id'=

    我的观点:

    <%= link_to "Remove this item", item_remove_path(@item),  class: 'button button-wide red-button', method: :patch %>
    

    routes.rb

    resources :items do
     patch '/remove', to: 'items#remove', via: :patch
    end
    
    3 回复  |  直到 7 年前
        1
  •  1
  •   kiddorails    7 年前

    你做错了什么:

    您已经扩展了restful资源 items ,包括 remove ,而且您希望获得 :id 在参数中。 params[:id] nil 在请求中,您可以通过查看该请求的rails开发日志来验证该请求。

    如何解决这个问题 :

    :

    '/remove', to: 'items#remove', on: :member . 添加 member route 会暴露 请求中的资源,使您的请求能够处理。

    方式2 使用现有资源 patch '/remove', to: 'items#remove' params[:item_id] 而不是 在请求中。

    注意 :你不必暴露 :id号 通过 patch '/remove/:id',

        2
  •  1
  •   Prosenjit Saha    7 年前

    更改路线如下

    resouces :items do 
      member do
       patch :remove
      end
    end
    

    它将创造 patch items/:id/remove

        3
  •  1
  •   31piy    7 年前

    您正在item s_controller.rb中访问item的id,因此必须定义一个路由,该路由也接受id作为@kiddorails在评论中提到的id。

    patch '/remove/:id', to: 'items#remove', as: :remove_item, via: :patch
    
    推荐文章