0

Я в настоящее время имеют следующие настройки в моей 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) выглядит следующим образом (Outtake):

= 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.

Например вы могли бы сделать:

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 %> 

Какой бы дать следующий PARAMS хэш:

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

Обратите внимание, что собственно плюрализация чрезвычайно важно здесь! Затем вы можете передать это своей модели пользователя, а 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