在访问相同模型的不同控制器上跳过一些验证

时间:2011-09-19 17:11:54

标签: ruby-on-rails

我不确定这个问题是由于我的设计缺乏知识还是问题所致。

基本上,我希望我的用户能够登录并获得默认角色。之后,他们可以成为“经理”,并需要转到第二个注册表单来实现这一目标。

但是,标准用户和经理之间的区别在于他们拥有的数据非常少(但在允许的权限方面却非常不同)。因此,我选择为它们使用单​​个User模型,然后选择两个控制器user_controller和managers_controller来为两个不同的注册表单和生成的创建请求提供服务。这可能是处理这种情况的错误方法。

我在此模型中设置了一些验证,我希望能够确保在初始注册表单上激活其中一些验证(当guest虚拟机成为用户时,通过users_controller)并且其余的被触发在第二个注册表单上(当用户成为经理时,通过managers_controller)。但是,我使用,例如validates_presence_of,然后检查两个表格上的验证,并抱怨我不是,例如,向我的普通用户询问出生日期。

我知道如何跳过对特定操作的检查但是如何为不同的控制器执行此操作?

3 个答案:

答案 0 :(得分:4)

验证在模型方面,因此它们独立于控制器。顺便说一下,你似乎在谈论基于角色的方法。

您可以使用if验证声明来实现目标。

validates :date_of_birth, :presence => true, :if => :manager?

def manager?
  # It actually  depends on your design. 
  # You can use any authorization library.

  self.role == "manager"
end

例如,流行的是cancan

答案 1 :(得分:1)

我认为User具有存储其角色的某种属性或关联。 rails中的每个验证器(如validates_presence_of)都可以是有条件的,只有当您通过:if选项提供的Proc / Method返回true时才会触发它。在这样的Proc中,您可以检查用户是否真的想成为“经理”。

我最近遇到了类似的问题,根据特定模型实例所处的状态,验证必须有所不同。请查看提供的state_machine(http://github.com/pluginaweek/state_machine)gem对此的支持。也许这更适合你的情况。

答案 2 :(得分:1)

怎么样

validates_presence_of :something, :if=>:manager?

def manager?
  self.manager
end

或者专门跳过验证

@user.save(false)

来自其中一个控制器