2013-03-25 59 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