2

scaffold は、次のような新しいアクションを生成します。

  def new
    @product = Product.new

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @product }
    end
  end

 def create
    @product = Product.new(params[:product])

    respond_to do |format|
      if @product.save
        format.html { redirect_to(@product, :notice => 'Product was successfully created.') }
        format.xml  { render :xml => @product, :status => :created, :location => @product }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @product.errors, :status => :unprocessable_entity }
      end
    end
  end

ビューは という名前のパーシャルをレンダリングしformます。newフォームは新しい製品を作成するように設定されたアクションでレンダリングされるため、 の目的は何@productですか? createアクションによって新しいオブジェクトもインスタンス化されていることがわかります。フォームをオブジェクトに結び付けて、すべてがアクションからアクションへと正しく進むようにするためだけに使用されますか?

4

3 に答える 3

4

新しいアクションの @product は、ビューに表示されるフォーム フィールドに入力するだけの保存されていないオブジェクトと考えることができます。これにより、new.html.erb は edit.html.erb とほぼ同じになり、1 つの部分的な _form.html.erb を共有できます。

このパーシャルが新しいアクションで使用されると、フィールドは新鮮で空で保存されていない @product オブジェクトによって入力されます。これは、新しいアクションに表示される Product.new です。パーシャルが編集アクションで使用されると、おそらくすべての属性の値を持つ @product オブジェクトが得られます。ここで、新しいアクションで @product を使用しなかったとします。new.html.erb で使用されるフォームは、edit で使用されるフォームとは異なる必要があります。モデルに新しいフィールドを追加する場合は、それらを維持してください。

このアプローチのもう 1 つの利点は、新しい @product の属性をビューにレンダリングする前に事前入力できることです。各製品のデフォルト名として「new product」という名前を使用するとします。新しいアクションでこれを行うには、次のようにします。

def new
    @product = Product.new(:name => 'new product')

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @product }
    end
  end
于 2011-03-09T17:20:43.420 に答える
3

主な目的の 1 つは、新規作成と編集に同じフォームを使用できるようにすることです。

コントローラーは @product オブジェクト (新規または既存) を渡し、Rails はそれが新しいレコードか既存のレコードかを確認します。レコード値を入力フィールド (既存) にプルするなど、それに基づいて特定の決定を行い、送信時にフォームを送信するコントローラー アクションを決定します。

于 2011-03-09T17:20:41.887 に答える
1

form_for がある場合、新しいアクションを使用して @product in を適切に初期化しますform_for @product。これには ActiveRecord モデルが必要です。私の記憶が正しければ、製品のスコープ (コントローラー アクションの場合) は要求で終了するため、作成アクションは新しいアクションを認識せず、別の製品を初期化する必要があります。

このform_forメソッドは、@product変数を使用してフォームをリソース コントローラーに正しく割り当て、正しい URL、id (更新の場合) などを見つけます。これについては、http: //guides.rubyonrails.org/form_helpers.htmlのセクション 2.3 で読むことができます。

メモリの使用量が気になる場合は、初期化する必要はありませんが@product、優れたリソースベースの を使用せずに独自のフォームを手動で作成する必要がありますform_for

于 2011-03-09T16:59:36.657 に答える