before_create в потребителски модел, задайте цяло число въз основа на имейл (RAILS)

Опитвам се да присвоя потребител към групата на неговата компания въз основа на неговия имейл домейн. Използвам devise + потвърждение, така че избягвах да използвам регулярен израз (не е необходимо да потвърждавам, че е валиден имейл...) и се опитвам да направя това по прост начин. Така че по същество това ще принуди потребителите 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.2ms) SAVEPOINT active_record_1 съществува потребител (0.3ms) ИЗБЕРЕТЕ 1 КАТО един ОТ потребители WHERE users.email = 'testtt@gmail. com' LIMIT 1 Company Load (0.3ms) SELECT companys.* FROM companys WHERE company.domain = 'gmail.com' LIMIT 1 (0.1ms) ROLLBACK TO SAVEPOINT active_record_1 NameError: недефинирана локална променлива или метод `user' за #‹User :0x007f817d7e6728›   -  person ndreckshage    schedule 05.11.2012
comment
промяната на (:имейл) на имейл свърши работа, позволи на потребителя да бъде запазен. но след запазване този потребител company_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

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