2015-03-19 61 views
2

我們正在使用設計進行註冊和身份驗證。我們有許多用戶和用戶都擁有一家公司的公司。我們希望在用戶註冊時從他們的電子郵件中提取域名,用它來標識他們的公司,並在創建用戶之前將該新用戶與該公司相關聯。需要在設計註冊的用戶上設置關聯

我們試圖劫持在這個RegistrationController create方法:

def create 
    super do |user| 
    company = Registrations::FindcompanyByEmailDomain.call(user.email) 
    if company 
     user.company = company 
     user.save 
    end 
    end 
end 

但這並不理想。它似乎影響創建後的重定向,我寧願這樣做另一種方式。有什麼建議麼?

這是我們試圖重寫設計路徑是用戶創建後:

def after_sign_up_path_for(resource) 
    go_to_a_path # doesn't work 
end 

def after_inactive_sign_up_path_for(resource) 
    go_to_another_path #also doesn't work 
end 

我們使用 before_create也嘗試:get_company

def get_company 
    self.company = FindCompanyByDomain(domain) 
end 

和同樣與before_save在用戶模型有一些魔術更新user.company,但當Devise控制器發揮作用時,兩個鉤子都會被忽略(binding.pry被忽略)。

任何幫助將不勝感激。

謝謝。

+0

你能準確地展示你在回調中做了什麼嗎? – 2015-03-19 04:45:13

+0

是,再次用該代碼更新。 – 2015-03-19 04:51:30

+0

您可以嘗試重寫'save',並檢查用戶是否被「持續?」,或不。如果您不希望每次保存用戶時檢查此項操作,並且您的用戶可以「確認」,那麼可以重寫'confirm!'。這通常用於向新確認的用戶發送歡迎電子郵件。 – 2015-03-19 05:03:10

回答

0

最後,我們推翻了在色器件控制器的方法:

 # POST /resource 
    def create 
    build_resource(sign_up_params) 

    resource_saved = resource.save 
    yield resource if block_given? 
    if resource_saved 
     if resource.active_for_authentication? 
     set_flash_message :notice, :signed_up if is_flashing_format? 
     sign_up(resource_name, resource) 
     respond_with resource, location: after_sign_up_path_for(resource) 
     else 
     set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_flashing_format? 
     expire_data_after_sign_in! 
     respond_with resource, location: after_inactive_sign_up_path_for(resource) 
     end 
    else 
     clean_up_passwords resource 
     @validatable = devise_mapping.validatable? 
     if @validatable 
     @minimum_password_length = resource_class.password_length.min 
     end 
     respond_with resource 
    end 
    end 

我們都在努力,因爲控制器會嘗試做其他事情之前保存的用戶,所以唯一的機會,我們必須改變,這是創建自己build_resource方法:

def build_resource(user_params) 
    super.tap do |user| 
    user.company = Registrations::FindCompanyByEmailDomain.call(user.email) 
    end 
end 

這使我們與相關公司的用戶模型傳遞到超和解決我們的問題。