0

我正在尝试根据他们的电子邮件域将用户分配到他们的公司组。我正在使用设计+确认,所以我避免使用正则表达式(不需要验证它是否是有效的电子邮件......),并试图以一种简单的方式做到这一点。所以本质上,它会强制用户 company_id (与该表匹配)在注册时分配,然后如果他们的公司不存在则不允许他们注册。所以这适用于 test@company.com 和 test@recruiting.company.com

在用户模型中

before_create :company_placement

...

def company_placement
  user_domain = (:email).split('@').last

  while user_domain.split('.').count > 2
    user_domain = user_domain.split('.', 2).last
  end

  if Company.find_by_domain(user_domain) != nil
    (:company_id) = Company.find_by_domain(user_domain).id
  else
    #error out
  end
end

当我逐步在rails控制台中执行此操作时,它似乎有效。但是当我运行时在控制台中,

> user = User.create!(name: "test", email: "test@example.com", password: "foobar")

我得到未定义的局部变量或方法'user' for #<'User....

感谢您的帮助,仍在学习rails...

4

1 回答 1

1

所以我又玩了一些,并认为我找到了我喜欢的解决方案

在用户模型中

before_validation :company_placement

...

def company_placement
  user_domain = self.email.split('@').last

  while user_domain.split('.').count > 2
    user_domain = user_domain.split('.', 2).last
  end

  if Company.find_by_domain(user_domain) != nil
    self.company_id = Company.find_by_domain(user_domain).id
  end
end

创建了设计注册控制器——控制器/注册_controller.rb

在新的注册控制器中

class RegistrationsController < Devise::RegistrationsController
  before_filter :verify_company, only: :create

  private

    def verify_company
      build resource #necessary for devise

      user_domain = resource.email.split('@').last

      while user_domain.split('.').count > 2
        user_domain = user_domain.split('.', 2).last
      end

      unless Company.find_by_domain(user_domain) != nil
        flash[:error] = 'Sorry, your company does not exist yet'
        redirect_to root_path
      end
    end
end

路线.rb

devise_for :users, :controllers => { :registrations => "registrations" }

所以我确信有一个更优雅的解决方案,但这对我有用。处理控制器中的错误/闪烁,然后如果公司存在,则用户通过模型自动分配给公司。

于 2012-11-06T07:04:35.313 回答