Saving multiple records with a single form in Rails 4

I have a model called Family that belongs to user_ I want the user to be able to add multiple family members to the same form, which is located in /views/families/new.html.erb

EDIT: Sorry, I should have provided more verbose code earlier after a bit of code modification

In routes.rb resources: family EDIT: In User.rb

class User < ActiveRecord::Base
  has_many :families
end

EDIT: At Family.rb

class Family < ActiveRecord::Base
belongs_to :user
end

In FamiliesController

def new

end

EDIT: I changed the form as follows:

<%= form_tag(controller: "families") do %>
<% i = 0 %>
<% 3.times do %>
<br>
<h2>Family Member #<%= i+1 %> : </h2>
<br>
<%= fields_for("family[#{i}]") do |f| %>
    <%= f.text_field :name, class: "form-control" , placeholder: "Name"%> <br>
    <%= f.text_field :relationship, class: "form-control" , placeholder: "Relationship" %> <br>
    <%= f.date_field :dob, class: "form-control" %> <br>
    <%= f.text_field :blood_group, class: "form-control", placeholder: "Blood group" %> <br>
    <%= f.text_field :email, class: "form-control", placeholder: "Email" %> <br>
    <%= f.number_field :phone, class: "form-control", placeholder: "Phone number" %> <br>
    <%= f.text_area :hobbies, class: "form-control", placeholder: "Hobbies" %> <br>
    <% i=i+1 %>
<% end %>
<hr>
<% end %> <br>
<%= submit_tag "Submit", class: "btn btn-primary" %> <br>

EDIT: create an action in FamilyController

def create

        @family = Family.new(family_params)
        a = params[:family][:"0"]
        @family.user_id = current_user.id
        if @family.save
        flash[:notice] = params[:family][:"0"]

    redirect_to dummy_path
else
    flash[:notice] = "didnt happen"
end
end
  • Thus, the user sees a form for creating 3 family members for one user_id
  • Enters data in 3 identical forms, and the images are sent
  • 3 3 db

EDIT: , :

def family_params
    params.require(:family).permit(:all)
end
  • , , db NULL.

  • ? ?

+4
3

nested forms. :

//family.rb

class Family < ActiveRecord::Base
  has_many :users

  accepts_nested_attributes_for :users
end

//user.rb

class User < ActiveRecord::Base
  belongs_to :family
end

///new.html.erb

<%= form_for(@family) do |f| %>
  <%= f.fields_for :users do |user| %>
    <p>
    <%= user.text_field :name %><br>
    <%= user.text_field :email %>
    </p>
  <% end %>

  <%= f.submit %>
<% end %>

//families_controller.rb

  [...]

  def new
    @family = Family.new
    3.times { @family.users.build }
  end

  [...]

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_family
      @family = Family.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def family_params
      params.require(:family).permit(:name, users_attributes: [ :name, :email ])
    end
+8

, , - update_multiple. params ( 123 456)

params = {:families => {123 => {:name => "foo", :address => "bar"}, 456 => {:name => "baz", :address => "qux"} }}

:

@families = []
params[:families].each do |id, attributes|
  if family = Family.find_by_id(id)
    family.update_attributes(attributes)
    @families << family
  end
end

, :

<% @families.each do |family| %>
  <div class="family">
    <label>Name: <%= text_field_tag "families[#{family_id}][name]", family.name %></label>
    <label>Address: <%= text_field_tag "families[#{family_id}][address]", family.address %></label>
  </div>
<% end %>

update, , [: family] , [: family].

+2

. name .

class User < ActiveRecord::Base
    has_many :families, :dependent => :destroy 
    accepts_nested_attributes_for :families, :allow_destroy => true
end

user_controller

def new
@user = User.new
@family = 3.times { @user.families.build } #here
end

:

def user_params 
params.require(:user).permit(:name, families_attributes: [:name,:email]) 
end

#users/new.html.erb
<%= form_for(@user) do |f| %>
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>
<%= f.fields_for :familes do |builder| %>
<%= render 'family_fields', :f => builder %>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>

#users/_family_fields.html.erb
<div>
<%= f.label :name, "Name" %>        
<%= f.text_field :name %>
<br>
<%= f.label :email, "Email" %>
<%= f.text_field :email %>
</div>
+1

Source: https://habr.com/ru/post/1540657/


All Articles