1

ユーザーには、shipping(:address_type=0) とbilling(:address_type=1) の 2 つの住所があります。住所タイプごとに 2 つの従来のネストされたフォームを含むユーザー フォームは、送信されるたびに平方時間生成され、検証に失敗します。

モデル:

class User < ActiveRecord::Base
    has_many :addresses, :dependent => :destroy
    accepts_nested_attributes_for :addresses
    validates_associated :addresses
end

class Address < ActiveRecord::Base
    belongs_to :user  
    validates :user, :address_type, :first_name, :last_name, :street
end

コントローラ

class UsersController < ApplicationController

public
    def new
        @user = User.new
        @shipping_address = @user.addresses.build({:address_type => 0})
        @billing_address = @user.addresses.build({:address_type => 1})
    end

    def create
        @user = User.new(params[:user])
        if @user.save
            #fine
        else
            render => :new
        end
    end

未完成のフォーム

=form_for @user, :html => { :multipart => true } do |ff|
    =ff.fields_for :addresses, @shipping_address do |f|
        =f.hidden_field :address_type, :value => 0

    =ff.fields_for :addresses, @billing_address do |f|
        =f.hidden_field :address_type, :value => 1

    =ff.submit
4

2 に答える 2

2

フォームは次のようになります。

=form_for @user, :html => { :multipart => true } do |ff|
    =ff.fields_for :addresses do |f|

他には何もありません。Addressessはすでにコレクションであるため、レンダリングは1つだけにする必要があります。また、「:addresses、@ shipping_address」を使用すると、@ user.addressesに含まれている場合でも、住所と配送先住所を表示できます。

新しいアクションで作成されたアドレスは、アドレスコレクションに含まれているため、そこに表示されます。

編集

これらの2つのアドレスのみが必要な場合は、それを並べ替えて、fields_forに直接渡すことができます。

=form_for @user, :html => { :multipart => true } do |ff|
    =ff.fields_for ff.object.addresses.sort{|a,b| a.address_type <=> b.address_type } do |f|

それはそれをする必要があります。

于 2012-05-25T08:30:16.000 に答える
0

驚いた?私はそうではないと思いますが、私はそうでした。私は正しいですか?そして、その愚かで単純です。

検証が失敗し、新しいアクション (フォーム) を再度レンダリングする場合、@shipping_address も @billing_address もありません。しかし、@user はすでに 2 つのアドレスを作成しており、ネストされたフォームは正しく動作し、最初の検証に失敗したときにそれぞれ 2 回レンダリングします。

    def create
        @user = User.new(params[:user])
        if @user.save
            #fine
        else
          @user.addresses.clear
          @user_address = @user.addresses.build({:address_type => 0})
          @user_address.attributes = params[:user][:addresses_attributes]["0"]

          @billing_address = @user.addresses.build({:address_type => 1})
          @billing_address.attributes = params[:user][:addresses_attributes]["1"]
          render => :new
        end
    end
于 2012-05-24T22:06:30.510 に答える