/ / Rails Associated Forms Forms - ruby-on-rails, forms, ruby-on-rails-5

Rails Associated Model Forms - ruby-on-rails, forms, ruby-on-rails-5

Mam modele

influencers (id, name, ...)
social_accounts (id, name, ....)
influencer_accounts (id, influencer_id, social_account_id, name, url)

Kiedy tworzę Influencer, otrzymuję 7 social_accounts dla których muszę podać szczegóły kont dla osoby wpływającej. Czy jest sposób, w jaki mogę zbudować formularze influencers has_many influencer_accounts z widoku przez pętlę?

wprowadź opis obrazu tutaj

Co próbowałem?

model / influencer.rb

class Influencer < ApplicationRecord

# Associations
has_many :influencer_accounts

accepts_nested_attributes_for :influencer_accounts , :allow_destroy => true, reject_if: proc { |attributes| attributes["account_url"].blank? }


end

model / influencer_accounts.rb

class InfluencerAccount < ApplicationRecord

# Associations
belongs_to :influencer
belongs_to :social_account

end

influencers_controller.rb

  def new
@influencer = Influencer.new
# @influencer.influencer_accounts.build

@social_accounts = SocialAccount.all
end


def create
# render json: params
@influencer = Influencer.new(influencer_params)

if @influencer.save
redirect_to @influencer, notice: "Influencer was successfully created."
else
@social_accounts = SocialAccount.all
render :new
end

end

views / influencers / new.html.erb

<% content_for :title, "New Influencer" %>

<div class="bg-light lter b-b wrapper-md">
<h1 class="m-n font-thin h3">New Influencer</h1>
</div>

<div class="wrapper-md">

<%= render "partials/flash_message" %>

<div class="panel panel-default">
<div class="panel-heading font-bold">
New Influencer
</div>
<div class="panel-body">
<%= nested_form_for @influencer, url: influencers_path, :html => {:multipart => true, :class => "form-horizontal"} do |f| %>

<div class="form-group <%= "has-error" if (@influencer.errors[:first_name].present? or @influencer.errors[:last_name].present?) %>">
<%= f.label :first_name, "Name", :class => "col-sm-2 control-label" %>
<div class="col-sm-3">
<%= f.text_field :first_name, :class => "form-control" %>
<%= show_errors(@influencer, :first_name).html_safe %>
</div>
<div class="col-sm-3">
<%= f.text_field :last_name, :class => "form-control" %>
<%= show_errors(@influencer, :last_name).html_safe %>
</div>
</div>
<div class="line line-dashed b-b line-lg pull-in"></div>

<div class="form-group <%= "has-error" if @influencer.errors[:email].present? %>">
<%= f.label :email, "Email Address", :class => "col-sm-2 control-label" %>
<div class="col-sm-6">
<%= f.text_field :email, :class => "form-control" %>
<%= show_errors(@influencer, :email).html_safe %>
</div>
</div>
<div class="line line-dashed b-b line-lg pull-in"></div>

<div class="form-group <%= "has-error" if @influencer.errors[:phone].present? %>">
<%= f.label :phone, "Phone Number", :class => "col-sm-2 control-label" %>
<div class="col-sm-6">
<%= f.text_field :phone, :class => "form-control" %>
<%= show_errors(@influencer, :phone).html_safe %>
</div>
</div>
<div class="line line-dashed b-b line-lg pull-in"></div>

<div class="form-group">
<label class="col-sm-2 control-label">Social Networks</label>
<div class="col-sm-10">
<div id="social-accounts">
<% @social_accounts.each do |social_account| %>

<%= f.fields_for :influencer_accounts do |ia| %>
<div class="row">

<div class="col-sm-3">
<%= ia.collection_select(:social_account_id, @social_accounts, :id, :name, { :prompt => false, :selected => social_account.id }, {:class => "form-control" }) %>
</div>

<div class="col-sm-5">
<div class="input-group m-b">
<%= ia.text_field :account_url, :class => "form-control" %>
<span class="input-group-btn">
<a class="btn btn-default remove"><span class="text-danger"><i class="fa fa-times"></i></span></a>
<%= ia.link_to_remove "Remove this task" %>
</span>
</div>
</div>


</div>
<% end %>
<% end %>
</div>

<p><%= f.link_to_add "Add a account", :influencer_accounts, "data-target" => "#social-accounts", class: "btn btn-info btn-xs" %></p>
</div>
</div>
<div class="line line-dashed b-b line-lg pull-in"></div>


<div class="form-group">
<div class="col-sm-4 col-sm-offset-2">
<%= f.submit "Create Influencer", :class => "btn btn-primary" %>
</div>
</div>

<% end %>
</div>
</div>
</div>

Po próbie przesłania - formularz nie zapisuje i zwraca zwrotne pola

wprowadź opis obrazu tutaj

Odpowiedzi:

1 dla odpowiedzi № 1

Powinieneś użyć klejnot kokonu do tego i również powinieneś użyć zagnieżdżona forma klejnot