在我的rails(4.1.6)應用程序,我有一個contact
模型has_one :address, :email
如何驗證單個事務中的多個模型?
我使用fields_for構建單一形式的接觸及相關地址和電子郵件:
的意見/聯繫人/新。 html.erb
<%= form_for @contact, ... %>
...
<%= fields_for :address do |address_fields| %>
<%= address_fields.text_field :street, ... %>
<%= address_fields.text_field :city, ... %>
...
<% end %>
<%= fields_for :email do |email_fields| %>
<%= email_fields.text_field :display_name, ... %>
<%= email_fields.text_field :mail_id, ... %>
<% end %>
...
<% end %>
我想需要的電子郵件,而地址是可選的。換句話說,如果沒有提供電子郵件,則不應創建3個模型,但如果僅提供電子郵件,則必須創建電子郵件和聯繫人。這不工作
一種方式是手工驗證其PARAMS在#構建任何東西之前創建contacts_controller和閃存[:錯誤]和返回,不保存,如果沒有指定電子郵件,或保存它,如果一切都很好:
contacts_controller.rb
def create
@contact = Contact.new
if(params_email_valid? params)
@contact.save!
@email = Email.create(...)
@email.save!
...
else
flash[:error] = 'Email must be specified to save a contact'
redirect_to :root
end
end
private:
def params_email_valid? params
!(params[:email][:display_name].blank? || params[:email][:mail_id].blank?)
end
可能工作的另一種方法是將下降到SQL,並通過交易直接SQL調用驗證一切。
但是,這些都不是'軌道方式',因爲驗證屬於模型。所以,我正在嘗試使用validates_presence_of,validates_associated和自定義驗證器的一些組合來驗證此場景。這裏的問題在於,關聯模型的模型級別驗證要求自己已經保存在數據庫中,或者需要將相關模型保存在數據庫中。有沒有辦法在單個事務中驗證所有這些模型?