0

私が次のモデルを持っているとしましょう

models / 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ユーザーの学位を表示し、新しい学位を作成するためのフォームを提供したいと思います。

views / users / 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 %>

...

views /degrees / _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

これに関する問題は、学位が検証に失敗した後のrender @user.degrees内部への呼び出しにあります。名前を指定せずにフォームを送信すると、メソッドが呼び出されviews/users/show.html.erbた後も度オブジェクトがメモリに保持され、無効なオブジェクトのパーシャルがレンダリングされます。この部分はメソッドを呼び出し、Nilエラーをスローします。renderviews/degrees/_degree.html.erbname

ビュー(つまり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の宝石を見てみましょう。#showページからインライン編集を行うことができ、別のコントローラーに送信したり、コレクションをクリーンアップしたりするよりもはるかにクリーンです。https ://github.com/bernat/best_in_placeをチェックしてください。

于 2013-03-25T16:07:07.940 に答える