2011-09-19 64 views
1

一些验证,我不知道这问题是由于缺乏知识或在我的设计有问题。跳过在不同的控制器访问同一型号

从本质上讲,我希望我的用户能够登录,并给予一个默认角色。稍后,他们可以成为“经理”,并需要第二个注册表单来实现这一点。

然而,标准用户和管理者之间的差异是很小的来讲什么数据他们有(但在他们被允许哪些权限方面非常不同)。因此,我选择了两个用户模型,然后使用两个控制器user_controller和managers_controller来提供两种不同的注册表单和最终的创建请求。可能这是处理这种情况的错误方法。

我在这个模型的一些验证设置,我希望能够确保一些验证被解雇初始注册表单(当客人成为用户,通过users_controller),其余是在第二个注册表单(当用户成为manager时,通过managers_controller)被解雇。不过,我使用,例如validates_presence_of那么它会检查两种形式的验证和抱怨,我不是,例如,询问我的普通用户的出生日期。

我知道如何跳过检查,负责具体行动,但如何做到这我针对不同的控制器?

回答

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

+0

哇,我不知道你能做到这一点。精彩!谢谢! –

1

我假设用户有某种属性或协会组成,它的角色存储。 rails中的每个验证器(如validates_presence_of)都可以有条件地仅在通过if选项提供的Proc/Method返回true时触发它。在这样一个Proc中,如果用户真的想成为“经理”,你可以检查。

我最近有一个类似的问题,其中有验证依赖于状态的特定模型实例将是不同。有一个看看state_machine(http://github.com/pluginaweek/state_machine)偕其为此提供支持。也许这更适合你的场景。

+0

有趣的一个做

@user.save(false) 

,我常常想知道状态机。听起来像是值得研究的东西。 –

1

如何

validates_presence_of :something, :if=>:manager? 

def manager? 
    self.manager 
end 

或者跳过验证具体情况,你可以从控制器

+0

跳过所有验证是一种糟糕的方法。我不建议这样做。 – Voldy

相关问题