我有一个基于请求域的不同国家/地区的应用程序。
我有一个国家/地区模型,并根据请求加载区域设置。
现在我的用户模型有问题。各个国家有不同的用户登录,即一个国家有用于 SSO 的 CAS,而另一个国家则有正常注册。
我正在使用 Devise,我想首先检查国家/地区,然后在用户模型中添加 IF 来检查国家/地区并加载该国家/地区的设计配置。
类似的东西
if country == "uk"
devise :invitable, :database_authenticatable, :registerable,
:recoverable, :trackable, :validatable, :timeoutable,
:omniauthable, :omniauth_providers => [:facebook, :google_oauth2]
else
devise :invitable, :cas_authenticatable, :registerable,
:recoverable, :trackable, :validatable, :timeoutable
end
如何检查国家/地区,然后在模型中应用 if 语句?
提前致谢
要记住的是,像
devise
这样的声明会在模型加载时发生,这通常在生产模式下只执行一次,因此您不能添加任何基于模型中可能发生的情况的有条件行为。当 country
实际定义时的未来。
您可以做的是使用“单表继承”(STI)对模型进行子类化,以拥有两种不同类型的用户:
class User < ActiveRecord::Base
end
class GenericUser < User
devise :invitable, ...
end
class UkUser < User
devise :invitable, ..., omniauth_providers: [ ... ]
end
这涉及到将字符串
type
列添加到您的架构中,但影响很小。在您的控制器中,您还必须创建适当的用户类型:
@user =
case (country)
when 'uk'
UkUser.create(params[:user])
else
GenericUser.create(params[:user])
end
或者该模式的一些变体。您还可以创建工厂方法:
class User
def self.create_for_country(params)
model_type =
case (params[:user][:country])
when 'uk'
UkUser
else
GenericUser
end
model_type.create(params[:user])
end