我正在尝试创建一个包含标准crud函数的模块。这是否可以做到,是明智的,是否有实践,或者不是,我想为自己找到答案。到目前为止,我已经创建了标准的get请求没问题。但是,我正在尝试实现一个创建操作,并且遇到了堆栈级别太深的错误'。
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的Gem提供了这个,所以我认为可以做到。
由于
答案 0 :(得分: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
<强>更新强>
它也可能是一个重定向循环。 flags_path
可能会遇到相同的create
方法(而不是索引),这会持续点击crud_create
before_action
,从而导致stack level too deep
错误。尝试更改重定向以进行测试:)
为避免再次点击create
,您可能需要将状态设置为303.从redirect_to
的APIDock条目:
如果您正在使用GET或POST以外的XHR请求并重定向 在请求之后,一些浏览器将遵循重定向使用 原始请求方法。这可能导致不良行为 比如双DELETE。要解决这个问题,你可以返回303 See 使用GET请求将遵循的其他状态代码。
示例:redirect_to route, status: 303