Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在模型中使用请求变量?_Ruby On Rails_Ruby_Devise - Fatal编程技术网

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

Ruby on rails 如何在模型中使用请求变量?,ruby-on-rails,ruby,devise,Ruby On Rails,Ruby,Devise,我有一个应用程序与不同的国家基于域的请求 我有一个国家/地区模型,它根据请求加载区域设置 现在我对用户模型有一个问题。各国有不同的用户登录,即一个国家有用于SSO的CAS,另一个国家有正常注册 我正在使用Desive,我想先检查国家/地区,然后在用户模型中添加IF以检查国家/地区并加载该国家/地区的Desive配置 差不多 if country == "uk" devise :invitable, :database_authenticatable, :registerable, :r

我有一个应用程序与不同的国家基于域的请求

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

现在我对用户模型有一个问题。各国有不同的用户登录,即一个国家有用于SSO的CAS,另一个国家有正常注册

我正在使用Desive,我想先检查国家/地区,然后在用户模型中添加IF以检查国家/地区并加载该国家/地区的Desive配置

差不多

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语句


提前感谢

需要记住的是,
design
之类的声明会在加载模型时发生,这通常只在生产模式下执行一次,因此您不能根据实际定义的
国家/地区
以后可能发生的情况添加任何有条件的行为

您可以使用“单表继承”(STI)对模型进行子类化,以拥有两种不同类型的用户:

class User < ActiveRecord::Base
end

class GenericUser < User
  devise :invitable, ...
end

class UkUser < User
  devise :invitable, ..., omniauth_providers: [ ... ]
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

回答很好,但工厂方法应该类似于
def self.create_for_country(attributes)
,并且应该从控制器获取白名单属性,因为模型无法访问
请求
,白名单是控制器关注的问题。
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