如何在模型中使用请求变量?

时间:2018-02-27 18:19:13

标签: ruby-on-rails ruby devise

我根据请求的域名拥有不同国家/地区的应用。

我有一个国家/地区模型,并根据请求加载区域设置。

现在我的用户模型存在问题。这些国家/地区具有不同的用户登录名,即一个国家/地区拥有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语句?

提前致谢

1 个答案:

答案 0 :(得分:1)

要记住的是,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
相关问题