0

我無法將對象保存到對應的表中。Rails validates_presence_of並驗證has_one關聯模型中的存在

模型客戶。我想,以確保它有一個相關的有效帳戶:

has_one :account, dependent: :destroy 
validates_presence_of :account 
validates_associated :account 

型號賬戶所屬客戶,所以我想執行的customer_id存在:

belongs_to :customer 
validates :customer_id, presence: true 

現在,我的問題是:應該以何種順序我保存這些對象?這些驗證有些不相容嗎?

因爲,如果我嘗試先保存客戶,這將是不可能的,我會得到

myCustomer.save.errors.messages 
{:account=>["can't be blank"]} 

很明顯,因爲我在模型中陳述

validates_presence_of :account 

但是,如果我嘗試先保存帳戶,請等待!我也無法保存它!我有

驗證:CUSTOMER_ID,存在:真

在我的賬戶模型,我還沒有保存任何客戶呢!

所以我也試圖只是初始化帳戶:

acc = Account.new(acc_attr: foo, acc_attr2: bar) 

,然後嘗試將它設置爲客戶這樣

Customer.account = acc 

但話又說回來,客戶不會因爲ACC保存是無效的(因爲它沒有customer_id,我在客戶模型中有validates_associated:account)

那麼,我將不得不放棄一種驗證模式嗎?有沒有解決方法?

謝謝!

回答

0

您可以添加到這個模型中:

attr_accessible: :customer_id 

,並加入到Gemfile中:

gem 'devise', '3.0.0.rc' 
gem 'protected_attributes' 
  • 在終端運行:$包安裝
  • 復位服務器

你應該檢查y我們的控制器:

params.require(:account).permit(:customer_id) 
+0

我需要什麼設計?另外,我還沒有控制器。我只想保存這些對象。 –

+0

使用'attr_accessible :: customer_id'來訪問數據庫。設計用於attr_accessible。控制器是一個選項,如果您的模型沒有任何控制器,則不需要檢入控制器。 –

+0

[Rails 4使用強參數](http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html)。 'attr_accessible'已被棄用,正如[here]所述(http://apidock.com/rails/ActiveModel/MassAssignmentSecurity/ClassMethods/attr_accessible)。 [This SO answer](http://stackoverflow.com/a/17371364)很好地描述了強參數如何取代'attr_accessible'。 –