2014-10-18 80 views
0

我想创建一个模块,其中容纳标准的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的宝石提供这个,所以我认为它可以完成。

感谢

回答

0

看起来你传递一个模型的实例,而不是模型类的方法需要。我想你的意思,而不是以下:

# 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_createbefore_action,导致stack level too deep错误。尝试改变重定向测试:)

为了避免再次打create,你可能需要将状态设置为303从APIDock条目redirect_to

如果您使用的是GET其他XHR请求或POST并且在请求之后重定向 ,则一些浏览器将遵循使用 原始请求方法的重定向。这可能会导致不良行为 ,如双DELETE。要解决此问题,您可以返回一个303请参阅 其他状态代码,它将使用GET请求进行跟踪。

例如:redirect_to route, status: 303

+0

它仍然给出了同样的错误。我尝试了这种变化,但无济于事。 – user3868832 2014-10-18 22:00:53

+0

@ user3868832我用另一种可能性编辑了我的答案。 – mattmattmatt 2014-10-18 22:11:51

相关问题