Как создать вложенную форму отдельной модели с отношением many_to_many в Rails? - PullRequest
0 голосов
/ 30 марта 2020

Необходимо создать одну форму с записями для 2 разных моделей и установить sh связь между таблицами соединений.

Модели:

class Account < ApplicationRecord
    has_many :account_authorizations
    has_many :authorizations, through: :account_authorizations
    accepts_nested_attributes_for :authorizations

end
class Authorization < ApplicationRecord
    has_many :account_authorizations
    has_many :accounts, through: :account_authorizations
end
class AccountAuthorization < ApplicationRecord
    belongs_to :account 
    belongs_to :authorization 
end

Модель authorization уже имеет несколько экземпляров в моей БД. Для authorization есть только 2 атрибута: auth_name и id.

Моя форма инициализируется с Account. В этой форме мне нужно иметь несколько флажков для Authorization записей. Я понимаю fields_for при использовании связанной модели, но неясно, как реализовать здесь метод check_box и получить значения.

Вот как выглядит моя views страница:

<% states = [ 'AL', 'AK', 'AS', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DC', 'DE', 'DC', 'FL', 'GA', 'HI', 'ID', 'IL', 'IN', 'IA', 'KS', 'KY', 'LA', 'ME', 'MH', 'MD', 'MA', 'MI', 'MN', 'MS', 'MO', 'MT', 'NE', 'NV', 'NH', 'NJ', 'NM', 'NY', 'NC', 'ND', 'MP', 'OH', 'OK', 'OR', 'PA' 'RI', 'SC', 'SD', 'TN', 'TX', 'UT', 'VT' 'VA', 'WA', 'WV', 'WI', 'WY'] %>
<% ppu = ['Employment', 'Insurance', 'Law Enforement'] %>

<div class="row justify-content-center">
    <div class="col-lg-16">
        <h3>Create New Account</h3>
    </div>
</div>
<div class="row justify-content-center">
    <div class="col-lg-16">

            <%= form_with(url: accounts_path, model: @paraaccount, local: true) do |f| %>

            <%= f.text_field :account_name, class: "form-control", placeholder: "Account Name" %>
            <%= f.text_field :account_address_line1, class: "form-control", placeholder: "address line 1" %>
            <%= f.text_field :account_address_line2, class: "form-control", placeholder: "address line 2" %>
            <%= f.text_field :account_address_city, class: "form-control", placeholder: "account city" %>
            <%= f.select :account_address_state, options_for_select(states), { :prompt => true }, class: "form-control", include_blank: true, placeholder: "state" %>
            <%= f.text_field :account_address_zipcode, class: "form-control", placeholder: "account zipcode" %>
            <%= f.text_field :contact_first_name, class: "form-control", placeholder: "contact first name" %>
            <%= f.text_field :contact_last_name, class: "form-control", placeholder: "contact last name" %>
            <%= f.text_field :contact_phone, class: "form-control", placeholder: "conact phone" %>
            <%= f.text_field :contact_email, class: "form-control", placeholder: "contact email" %>
            <%= f.select :account_ppu, options_for_select(ppu), { :prompt => true }, class: "form-control", include_blank: true, placeholder: "ppu" %>
            <%= f.text_area :account_notes, class: "form-control", placeholder: "Notes..." %>

            <div class="d-flex justify-content-between flex-wrap">
             <%= f.fields_for :authorization do |auth| %> 
            <div class="order-3 p-2 bd-highlight">
                    # THIS IS WHERE I'M CONFUSED
                <%= auth.label #need to get attribute `auth_name` for the label here %>
                <%= auth.check_box #need to implement checkboxes here for each entry in `Authorizations` %>
            </div>
            <% end %>
             </div>
            <%= f.submit "Create", class: 'btn btn-success' %>
            <% end %>



    </div>
</div>

Мне нужно захватить значения отмеченных полей и использовать id из Authorization в params создать связь таблицы соединений с Account при создании нового экземпляра Account.

Надеюсь, это имеет смысл.

1 Ответ

0 голосов
/ 31 марта 2020

вы можете использовать collection_check_boxes

<%= form.collection_check_boxes(:authorization_ids, Comment.all, :id, :auth_name) %>

в контроллере добавить authorization_ids: [] к разрешенным параметрам

collection_singular_ids

...