Rails:在该集合中的对象验证失败后呈现集合

时间:2013-03-25 14:59:48

标签: ruby-on-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内,我想显示用户学位并提供创建新学位的表格。

视图/用户/ 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里面我们有

控制器/ 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

问题是在学位验证失败后调用render @user.degrees views/users/show.html.erb。如果我在没有提供名称的情况下提交表单,则在调用render方法后,degree对象将保留在内存中,并将为无效对象呈现views/degrees/_degree.html.erb部分。这部分调用name方法,该方法抛出Nil错误。

我可以在视图中抛出条件(即unless degree.name.nil?),但这对我来说有点气味。如果度数对象上的属性增长,则该部分将包含太多条件逻辑。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

试试这个,

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

这将通过从degrees数组中删除未保存的记录来停止部分呈现。

将其移入控制器会更干净,

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

然后在你看来,

<%= render @user_degrees %>

答案 1 :(得分:0)

我来看看best_in_place gem。允许您从#show页面进行内联编辑,比提交到其他控制器,清理集合等更清晰。检查出来:https://github.com/bernat/best_in_place