我有一个方法可以切换布尔值,但是由于未找到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
答案 0 :(得分:1)
您要在items_controller.rb中访问项目的ID,因此您必须定义一条接受ID的路线,就像上面评论中提到的@kiddorails。
patch '/remove/:id', to: 'items#remove', as: :remove_item, via: :patch
答案 1 :(得分:1)
您在做什么错了:
您已经扩展了静态资源items
,使其包含remove
,并且您希望在参数中获得:id
。 params[: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
,然后您无需在控制器中进行任何更改。