2017-03-10 82 views
0

用下面的關聯:驗證存在從另一個模型

class Profile < ActiveRecord::Base 
    belongs_to :visitor 
    belongs_to :contact_point 
    validates :contact_point, presence: true 
end 

class Visitor < User 
    has_one :profile, dependent: :destroy 
    has_one :contact_point, through: :profile 
end 

class ContactPoint < User 
    has_many :profiles 
    has_many :visitors, through: :profiles 
end 

每個ContactPoint有一個電子郵件。當訪問者使用以下表單創建其個人資料時,她需要使用屬於ContactPoint的電子郵件地址確定個人資料聯繫點。聯繫點用戶已創建,訪問者不應該能夠更新ContactPoint模型。

<%= form_for @profile do |f| %> 
    <%= f.label 'First Name' %> 
    <%= f.text_field :first_name %> 
    <%= f.label 'Last Name' %> 
    <%= f.text_field :last_name %> 
    <%= fields_for :contact_point, @profile.contact_point do |ff| %> 
    <%= ff.label 'Contact point email' %> 
    <%= ff.text_field :email %> 
    <% end %> 
<% end %> 

ProfilesController我傳遞的參數來分析這樣的模型:當沒有ContactPoint提供的電子郵件地址

def create 
    @profile = Profile.create(profile_params) 
end 

def profile_params 
    contact_point = ContactPoint.find_by_email(params[:contact_point][:email]) 
    params.require(:profile).permit(:first_name, :last_name) 
          .merge(visitor_id: current_user.id, contact_point: contact_point) 
end 

通過以上的設置,該contact_point變量設置爲nil驗證人無法區分填寫的聯繫人電子郵件是否爲空。 現在,我如何添加驗證以檢查contact_points表中此電子郵件地址的存在並顯示自定義錯誤消息?

+0

'驗證:contact_point,存在:TRUE'應該做的伎倆。你確定記錄正在保存到數據庫嗎? –

+0

問題是,contact_point = ContactPoint.find_by_email(params [:contact_point] [:email])'設置contact_point_id爲零,當這個電子郵件地址沒有contact_point時。 contact_point_id將爲零的其他情況是當發佈表單中該字段爲空時。我需要驗證者來隔離這兩個案件。 – Sajjad

回答

0

最好的方法是使用自定義驗證來檢查contact_pounts.email是否爲空?如果是,則返回false。

編輯:

我的大腦是一些睡眠功能後,現在好多了。你可以用rails來做到這一點。這是我的方式。

class Profile < ActiveRecord::Base 
    belongs_to :visitor 
    belongs_to :contact_point 
    validates :contact_point, presence: true 
    accepts_nested_attributes_for :contact_point 
end 

class Visitor < User 
    has_one :profile, dependent: :destroy 
    has_one :contact_point, through: :profile 
end 

class ContactPoint < User 
    has_many :profiles 
    has_many :visitors, through: :profiles 
    validates :email, presence: true 
end 

這是怎麼回事?我們接受來自Profile的關聯(ContactPoint)的嵌套屬性,所以我們可以通過@profile表單將它們傳遞給控制器​​。模型將處理驗證並相應地設置錯誤消息。

這有道理嗎?

+0

你可以試試這個嗎? – Jeremie

0

你必須做你自己在你的控制器,是這樣的:

def create 
    @profile = Profile.create(profile_params) 
    if [email protected]_point 
    if params[:contact_point][:email].present? 
    @profile.errors.add(:contact_point, 'No contact with found') 
    else 
    @profile.errors.add(:contact_point, 'Please provide an email') 
    end 
    render :new 
    end 

end