Ruby on rails 根据深度嵌套表单中的当前用户更改运行哪些Rails验证

Ruby on rails 根据深度嵌套表单中的当前用户更改运行哪些Rails验证,ruby-on-rails,validation,nested-forms,Ruby On Rails,Validation,Nested Forms,我正在使用一个嵌套表单,它总共包含7个模型,每个模型都有不同的验证。当简单地编辑表单时,验证运行并显示良好,数据保存正确。但是,我需要根据提交表单的人运行不同的验证(即,管理员可以跳过一些其他必填字段) 我想我可以通过使用attr\u accessible:在我的模型中编辑用户,然后在控制器中设置来跳过某些验证 class ModelExample < ActiveRecord::Base attr_accessible :editing_user validates_presen

我正在使用一个嵌套表单,它总共包含7个模型,每个模型都有不同的验证。当简单地编辑表单时,验证运行并显示良好,数据保存正确。但是,我需要根据提交表单的人运行不同的验证(即,管理员可以跳过一些其他必填字段)

我想我可以通过使用attr\u accessible:在我的模型中编辑用户,然后在控制器中设置来跳过某些验证

class ModelExample < ActiveRecord::Base
  attr_accessible :editing_user
  validates_presence_of :email, :unless => "editing_user == 'admin'"
end

class ModelExamplesController < ActionController::Base
  def create
    @model_example = ModelExample.new(params[:model_example])
    @model_example.editing_user = 'admin'
    @model_example.save
  end
end
类模型示例“编辑”\u用户==“管理员”
结束
类ModelExamplesController
我在嵌套模型中使用了这个基本结构,检查是否可以正确保存。这就是奇怪行为开始的地方。出于某种原因,ActiveRecord似乎多次尝试保存嵌套模型,每次都运行验证。奇怪的是我调用@model_example.save,如果失败,它应该返回false。但是,第一次验证会通过(因为设置了editing_user),但随后的验证会失败并引发异常,因此normal.save方法最终会引发异常而不是返回


有人知道如何避免让ActiveRecord执行所有额外的验证和保存,或者如何在这些重复操作中持续编辑用户吗?

ha!就在昨天,好吧,反正几乎是相同的用例(持久化用户)。以下是我如何解决这个问题的(我抄袭了我的好友Jason Dew的所有功劳):

将应用程序控制器传递到块并设置User.current变量

然后在任何其他模型中

class MyClass < ActiveRecord::Base
  def log
    "This was done by #{User.current}"
  end
end
classmyclass
至少在rails 3中,您还可以使用
cattr\u accessor:current
使其更短。
before_filter :require_user #=> which in this case goes off and sets the current_user var
before_filter {|c| User.current = current_user}
class MyClass < ActiveRecord::Base
  def log
    "This was done by #{User.current}"
  end
end