2013-03-25 39 views
0

比方說,我有以下型號Rails的:即集合中的對象渲染後的集合驗證失敗

型號/ user.rb

class User 
    has_many :degrees 
end 

型號/ degree.rb

class Degree 
    attr_accessible :name 

    belongs_to :user 

    validates :name, :presence => true 
end 

以內Users#show我想顯示用戶學位並提供af orm創建一個新的。

的意見/用戶/ show.html.erb

... 

Your current degrees: 
<%= render @user.degrees %> 

Add a new degree: 
<%= form_for Degree.new do |f| %> 
    <%= f.text_field :name %> 
    <%= f.submit "Submit" %> 
<% end %> 

... 

的意見/度/ _degree.html.erb

... 
<%= degree.name %> 

所以裏面degrees_controller.rb我們

controllers/degrees_controller.rb

class DegreesController < ApplicationController 

    # ... 

    def create 
    degree = current_user.degrees.build(params[:degree]) 

    if degree.save 
     redirect_to # somewhere with a flash message 
    else 
     render "users#show" 
    end 
    end 
end 

的問題,這是在內部views/users/show.html.erb後一定程度未通過驗證調用render @user.degrees。如果我在未提供名稱的情況下提交表單,則在調用render方法後,度數對象將保留在內存中,並且會爲無效對象呈現局部對象views/degrees/_degree.html.erb。這部分調用了name方法,該方法拋出了Nil錯誤。

我可以在視圖中添加條件(即unless degree.name.nil?),但是這對我來說很陌生。如果度數對象上的屬性增長,那麼該部分將包含過多的條件邏輯。

有什麼想法?

+0

請添加views/degrees/_degree.html.erb來源和完整的錯誤信息 – Fivell 2013-03-25 15:09:31

+0

這是你可以使用嵌套屬性和fields_for的東西,看看那些。 – Matt 2013-03-25 15:10:19

+0

@Fivell,我添加了一部分_degree.html.erb視圖來說明問題。 @Matt,我想了解嵌套的屬性,但是現在選擇不走這條路。謝謝。 – Feech 2013-03-25 16:20:23

回答

2

試試這個,

<%= render @user.degrees.delete_if(&:new_record?) %> 

這樣會停止你的部分被渲染未保存記錄通過從degrees陣列刪除它們。

這將是清潔這個進入你的控制器,

@user_degrees = current_user.degrees.delete_if(&:new_record?) 

那麼在你看來,

<%= render @user_degrees %> 
+0

我喜歡這個解決方案。非常感謝!我看到的唯一的其他解決方案是在用戶模型中使用'accep_nested_attributes_for',這不是我想要去的路線。 – Feech 2013-03-25 16:23:14

0

我想看看在best_in_place寶石。允許您從#show頁面進行內聯編輯,並且比提交給其他控制器,清理收藏夾等更清潔。檢查出來:https://github.com/bernat/best_in_place

+0

我以前在其他項目中使用過best_in_place,但我不明白這是如何解決問題的。當然在編輯學位,但是如何增加一個新的學位呢? – Feech 2013-03-25 16:25:39

+0

我的不好。我在想如何best_in_place處理無效數據(簡單地忽略它),並忘記它是僅編輯。然而,這將是非常光滑的:點擊一個元素,輸入並按回車。如果它無效,它會忽略它,否則它會將它添加到度數列表中。 – 2013-03-25 17:14:31

+0

我其實正在考慮爲現有學位整合best_in_place,並可能使用ajax來獲得新學位。謝謝! – Feech 2013-03-25 17:21:58