0

假设我有以下模型

模型/用户.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,并将呈现views/degrees/_degree.html.erb无效对象的部分。此部分调用该name方法,该方法引发 Nil 错误。

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

有什么想法吗?

4

2 回答 2

2

尝试这个,

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

这将通过将未保存的记录从degrees.

把它移到你的控制器中会更干净,

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

那么在你看来,

<%= render @user_degrees %>
于 2013-03-25T15:10:28.950 回答
0

我会看看 best_in_place gem。允许您从 #show 页面进行内联编辑,并且比提交到不同的控制器、清理集合等要干净得多。检查一下:https ://github.com/bernat/best_in_place

于 2013-03-25T16:07:07.940 回答