crud动作进入模块导致堆栈级别太深的错误

时间:2014-10-18 21:25:21

标签: ruby-on-rails ruby crud

我正在尝试创建一个包含标准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提供了这个,所以我认为可以做到。

由于

1 个答案:

答案 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