crud行动到模块导致堆栈级别太深
问题描述:
我想创建一个模块,其中容纳标准的crud功能。这是否可以做到,是明智的,坚持练习,还是不行,我想为自己找出答案。到目前为止,我已经创建了标准的get请求没有问题。不过,我正在尝试执行一个创建操作,并遇到“堆栈级别太深的错误”。crud行动到模块导致堆栈级别太深
class FlagsController < ApplicationController
include CrudConcern
before_action lambda { crud_index(Flag.all) }, only: :index
before_action lambda { crud_new(Flag.new) }, only: :new
before_action lambda { crud_create(Flag.new, flags_path) }, only: :create
def create
end
end
CRUD模块
def crud_create(model, route)
variable = model(params)
if variable.save
flash[:notice] = "Saved!"
redirect_to route
else
flash[:error] = "Try again"
render :new
end
end
为什么会出现这种情况?有没有办法解决它?有一个名为Crudify的宝石提供这个,所以我认为它可以完成。
感谢
答
看起来你传递一个模型的实例,而不是模型类的方法需要。我想你的意思,而不是以下:
# in controller
before_action lambda { crud_create(Flag, flags_path) }, only: :create
# in crud module
def crud_create(model, route)
variable = model.new(params) # change is here
if variable.save
flash[:notice] = "Saved!"
redirect_to route
else
flash[:error] = "Try again"
render :new
end
end
UPDATE
可能也是一个重定向循环。 flags_path
可能会碰到相同的create
方法(与索引相反),它将不断地击中crud_create
before_action
,导致stack level too deep
错误。尝试改变重定向测试:)
为了避免再次打create
,你可能需要将状态设置为303从APIDock条目redirect_to
:
如果您使用的是GET其他XHR请求或POST并且在请求之后重定向 ,则一些浏览器将遵循使用 原始请求方法的重定向。这可能会导致不良行为 ,如双DELETE。要解决此问题,您可以返回一个303请参阅 其他状态代码,它将使用GET请求进行跟踪。
例如:redirect_to route, status: 303
它仍然给出了同样的错误。我尝试了这种变化,但无济于事。 – user3868832 2014-10-18 22:00:53
@ user3868832我用另一种可能性编辑了我的答案。 – mattmattmatt 2014-10-18 22:11:51