0

で1人のユーザのための複数のアドレスを作成します。私は現在、私のRailsで以下の設定が5アプリケーション持っFormtastic

class User < ApplicationRecord 
    has_many :addresses 
    accepts_nested_attributes_for :addresses 
end 

class Address < ApplicationRecord 
    belongs_to :user 
end 

対応するコントローラは、次のようになります。

class UsersController < ApplicationController 
    def new 
    @user = User.new 
    end 

    def create 
    @user = User.new(user_params) 

    if @user.save 
     redirect_to users_path 
    else 
     render 'new', notice: "User could not be created" 
    end 
    end 

    private 

    def user_params 
    params.require(:user).permit(
     :first_name, :last_name, :email, ... 
    ) 
    end 
end 

各ユーザーが持つことになっていますユーザー作成時に設定する必要がある複数のAddresses(請求や配送など)。 (formtasticで作られた)形は、この(アウトテイク)のようになります。

= semantic_form_for @user do |user| 
    = user.input :first_name 
    = user.semantic_fields_for Address.new do |shipping_address| 
    = shipping_address.input :city 
    = shipping_address.input :usage, 
     as: :hidden, 
     input_html: { value: 'shipping' } 
    = user.semantic_fields_for Address.new do |billing_address| 
    = billing_address.input :city 
    = billing_address.input :usage, 
     as: :hidden, 
     input_html: { value: 'billing' } 

問題は、後者のアドレスはそう一つだけが作成され、サイトのパラメータに存在することOFCれます。

同じユーザーに対して複数のアドレスを作成するにはどうすればよいですか?

答えて

0

ネストされたレコードを作成するには、そのレコードをシードしてシードし、そのアソシエーションをfields_forに渡します。あなたがどうなる例えば

:適切な複数形がここに非常に重要であることを

{ 
    user: { 
    addresses_attributes: [ 
     { 
     street: 'Wall Street', 
     value: 'shipping' 
     }, 
     { 
     street: 'Broadway', 
     value: 'billing' 
     }, 
    ] 
    } 
} 

注:以下のparamsハッシュを与えるだろう

class UsersController < ApplicationController 
    # ... 
    def new 
    @user = User.new 
    # if we skipped this step there would be no address inputs on the form. 
    @user.addresses.new(value: 'shipping') 
    @user.addresses.new(value: 'billing') 
    end 
end 

<%= semantic_form_for(@user) do |f| %> 
    # ... 
    # fields_for iterates through @user.addresses creating 
    # inputs for each 
    <% f.semantic_fields_for :addresses do |a| %> 
    <%= a.inputs :street %> 
    <%= a.input :value, as: :hidden %> 
    <% end %> 
<% end %> 

! これをあなたのユーザモデルに渡すことができ、accepts_nested_attributesは残りの作業を行います。

class UsersController < ApplicationController 
    # ... 
    def create 
    @user = User.new(user_params) 
    if @user.save 
     #... 
    else 
     # ... 
    end 
    end 

    private 
    def user_params 
     params.require(:user) 
      .permit(:email, :password, addresses_attributes: [:value, :street, :city]) # etc 
    end 
end 
関連する問題