2017-03-10 43 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