before_create в пользовательской модели задает целое число на основе электронной почты (RAILS)

Я пытаюсь назначить пользователя в группу своей компании на основе его домена электронной почты. Я использую разработку + подтверждение, поэтому я избегал использования регулярных выражений (не нужно подтверждать, что это действительный адрес электронной почты...), и я пытаюсь сделать это простым способом. По сути, это заставит пользователей company_id (которые совпадают с этой таблицей) быть назначенными при регистрации, а затем не позволит им зарегистрироваться, если их компания не существует. Таким образом, это будет работать как для [email protected], так и для [email protected].

В пользовательской модели

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: "[email protected]", password: "foobar")

Я получаю неопределенную локальную переменную или метод 'user' для #‹'User....

Спасибо за любую помощь, все еще изучаю рельсы...


person ndreckshage    schedule 05.11.2012    source источник
comment
user_domain = (:email).split('@').last ‹- :email должно быть email я полагаю.   -  person Chris Salzberg    schedule 05.11.2012
comment
Вы уверены, что этот обратный вызов вызывает указанную выше ошибку? проверьте обратную трассировку и номер строки   -  person HungryCoder    schedule 05.11.2012
comment
запустить тот же оператор, не приравнивая его к пользовательской переменной   -  person Narmadha    schedule 05.11.2012
comment
Не могли бы вы предоставить нам немного больше сообщения об ошибке?   -  person deRailed    schedule 05.11.2012
comment
› User.create!(имя: test, электронная почта: [email protected], пароль: foobar) (0,2 мс) ТОЧКА СОХРАНЕНИЯ active_record_1 Пользователь существует (0,3 мс) ВЫБЕРИТЕ 1 КАК ОДИН ИЗ пользователей, ГДЕ users.email = 'testtt@gmail. com' LIMIT 1 Company Load (0,3 мс) SELECT companys.* FROM companys WHERE company.domain = 'gmail.com' LIMIT 1 (0,1 мс) ROLLBACK TO SAVEPOINT active_record_1 NameError: неопределенная локальная переменная или метод `user' для #‹User :0x007f817d7e6728›   -  person ndreckshage    schedule 05.11.2012
comment
изменение (: электронная почта) на адрес электронной почты сработало, что позволило сохранить пользователя. но после сохранения этот user_id по-прежнему равен нулю. Но это прогресс, я продолжу эксперименты, когда вернусь с работы сегодня вечером.   -  person ndreckshage    schedule 05.11.2012
comment
Попробуйте также изменить (:company) на self.company. Почему бы не сделать это в качестве проверки, подтверждающей, что компания существует, чтобы разрешить регистрацию?   -  person omarvelous    schedule 06.11.2012


Ответы (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

Создан контроллер регистрации устройств -- controllers/registrations _ 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

routes.rb

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

Так что я уверен, что есть более элегантное решение, но это работает для меня. Обрабатывает ошибки/вспышки в контроллере, а затем, если компания существует, пользователь автоматически назначается компании через модель.

person ndreckshage    schedule 06.11.2012