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

问题描述 投票:0回答:2

我有一个基于请求域的不同国家/地区的应用程序。

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

现在我的用户模型有问题。各个国家有不同的用户登录,即一个国家有用于 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 语句?

提前致谢

ruby-on-rails ruby devise
2个回答
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

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.