ActiveRecord :: RecordNotFound“找不到ID”

时间:2018-08-16 06:25:36

标签: ruby-on-rails activerecord

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

我的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 个答案:

答案 0 :(得分:1)

您要在items_controller.rb中访问项目的ID,因此您必须定义一条接受ID的路线,就像上面评论中提到的@kiddorails。

patch '/remove/:id', to: 'items#remove', as: :remove_item, via: :patch

答案 1 :(得分:1)

您在做什么错了:

您已经扩展了静态资源items,使其包含remove,并且您希望在参数中获得:idparams[:id]是请求中的nil,您可以通过查看该请求的Rails开发日志来进行验证。

如何解决此问题

方法1

更改为补丁'/remove', to: 'items#remove', on: :member。添加member route将在请求中公开:id的资源,从而使您的请求得以处理。

方法2 : 使用现有资源patch '/remove', to: 'items#remove',但在请求中使用params[:item_id]代替params[:id]

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

答案 2 :(得分:1)

如下更改路线

resouces :items do 
  member do
   patch :remove
  end
end

它将创建patch items/:id/remove,然后您无需在控制器中进行任何更改。