2013-04-09 62 views
0

不知道這個問題是有道理的,所以我會通過一個例子來說明:如何設置自定義驗證Rails中創建之前的關聯

基本上我有我的應用程序一個公司的模式和公司職員。該員工是一個設計模型,可以註冊/登錄。我有一個嚮導,用於在註冊後選擇他們工作的公司,因此該模型接受公司的嵌套屬性。

在他們選擇他們工作的公司的階段,我想建立一個驗證,以確保他們只通過匹配員工的電子郵件域和公司的電子郵件域在我的數據庫中選擇他們工作的公司。我應該在哪一點做到這一點?我應該設置一個自定義驗證器還是使用回調?

這裏是我的代碼:

員工:

class Employee < ActiveRecord::Base 

    ################## 
    # Base 
    ################### 

    rolify 
    # Include default devise modules. Others available are: 
    # :token_authenticatable, :confirmable, 
    # :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, :confirmable, :omniauthable 

    # Setup accessible (or protected) attributes for your model 
    attr_accessible :name, :email, :password, :password_confirmation, :remember_me, :company_id, :company_attributes 


    ################## 
    # Associations 
    ################### 

    belongs_to :company 
    accepts_nested_attributes_for :company 
    has_many :authentications, dependent: :destroy 

end 

公司:

class Company < ActiveRecord::Base 


    ################## 
    # Base 
    ################### 

    attr_accessible :name, :address_attributes, :email, :phone_number, :website, :confirmed 



    ################## 
    # Associations 
    ################### 

    has_one :address 
    accepts_nested_attributes_for :address 
    has_many :employees 


end 

這裏是控制器,它負責爲員工選擇一家公司,它是一個絕對的寶石精靈控制器。

class EmployeeStepsController < ApplicationController 
    before_filter :authenticate_employee! 
    include Wicked::Wizard 
    steps :personal, :company_details, :enter_company_details 

    def show 
    @employee = current_employee 
    case step 
    when :enter_company_details 
     if @employee.company 
     skip_step 
     else 
     @employee.build_company.build_address 
     end 
    end 
    render_wizard 
    end 

    def update 
    @employee = current_employee 
    @employee.attributes = params[:employee] 
    render_wizard @employee 
    end 

    private 

    def finish_wizard_path 
    employee_url(@employee) 
    end 

end 

我還有一個控制器,它與添加公司分別涉及到網站管理員的網站,但我只想要觸發嚮導控制器中的電子郵件驗證又名當員工選擇他們的公司。對此有何建議?

回答

0
class Employee < ActiveRecord::Base 

    ################## 
    # Base 
    ################### 

    rolify 
    # Include default devise modules. Others available are: 
    # :token_authenticatable, :confirmable, 
    # :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, :confirmable, :omniauthable 

    # Setup accessible (or protected) attributes for your model 
    attr_accessible :name, :email, :password, :password_confirmation, :remember_me, :company_id, :company_attributes 


    ################## 
    # Associations 
    ################### 

    belongs_to :company 
    accepts_nested_attributes_for :company 
    has_many :authentications, dependent: :destroy 

    # HERE 
    validate :my_custom_vaildator 

    private 
    def my_custom_vaildator 
     # do stuff ..... 
     # based off that stuff add errors 
     if some_logic_about_your_company? 
      self.errors.add(:base, "select the company you work for.") 
     elsif some_other_logic? 
      self.errors.add(:name, "your name sucks.") 
     end 
    end 
end 

記住:

從未返回nil或false。如果你這樣做會發生爆炸!

=)

這一切都表示,前端不應該允許他們選擇的東西是不允許的。