私はここで他の多くのトピック(1、2、3 ...)を読みましたが、どれも私の問題を本当に解決しませんでした。
これが私の3つのモデルです。
User
has_many :memberships
has_many :accounts, :through => :memberships
accepts_nested_attributes_for :memberships
end
Account
has_many :memberships
has_many :users, :through => :memberships
accepts_nested_attributes_for :memberships
end
Membership
attr_accessible :account_id, :url, :user_id
belongs_to :account
belongs_to :user
end
ご覧のとおり、私の参加モデルのメンバーシップには追加の属性があります:url
。
アカウントテーブルには、GitHub、Stack Overflow、Twitter、Facebook、LinkedInなどのオンラインサービスの名前を保存しています。合計で9つあります。これは、私が頻繁に更新する傾向のない一定量のアカウントです。
ユーザーフォームで、これを作成したいと思います。
これらのフィールドのいずれかに入力された値は、次の3つの値を使用して、Membershipsテーブルにのみ送信する必要があります。
url
(テキストフィールドに入力された値)user_id
(現在のユーザーフォームのID)account_id
(関連するアカウントのID、たとえばLinkedInは「5」です)
私は3つのオプションを試しました。それらはすべて機能しますが、部分的にしか機能しません。
オプション1
<% for account in @accounts %>
<%= f.fields_for :memberships do |m| %>
<div class="field">
<%= m.label account.name %><br>
<%= m.text_field :url %>
</div>
<% end %>
<% end %>
アカウントごとに1つずつ、合計9つのテキストフィールドが必要です。そこで、アカウントをループして、メンバーシップモデルに関連するURLフィールドを作成します。
初めてフィールドが正しく表示されますが、次回は81フィールドが表示されます。
オプション#2
<% @accounts.each do |account| %>
<p>
<%= label_tag(account.name) %><br>
<%= text_field_tag("user[memberships_attributes][][url]") %>
<%= hidden_field_tag("user[memberships_attributes][][account_id]", account.id) %>
<%= hidden_field_tag("user[memberships_attributes][][user_id]", @user.id) %>
</p>
<% end %>
メンバーシップテーブルの各列に3つの値を手動で入力しようとしています。
それは動作しますが:
- アカウントとユーザーIDの両方を表示することはあまり安全ではないようです(いいえ?)
- ユーザーを編集するたびにフィールドがリセットされます
- 送信ごとに値が複製されます
オプション#3(これまでで最高のもの)
<%= f.fields_for :memberships do |m| %>
<div class="field">
<%= m.label m.object.account.name %><br>
<%= m.text_field :url %>
</div>
<% end %>
メンバーシップモデル用に、ユーザーフォームにネストされたフォームを作成しています。
それはほぼ完全に機能します:
- アカウントごとに1つずつ、正確に9つのフィールド
- 重複はありません
ただし、Membershipsテーブルがすでに入力されている場合にのみ機能します。(たとえば、オプション#2を使用)。
そこで、UsersControllerを使用していくつかのインスタンスを構築してみました。
if (@user.memberships.empty?)
@user.memberships.build
end
しかし、m.labelm.object.account.name行でこのエラーが発生します。
undefined method `name' for nil:NilClass
とにかく、私はおそらくここでモデルを通してhas_manyについて何かが欠けています。has_and_belongs_to_manyアソシエーションを作成できましたが、ここでは、3番目のモデル(アカウント)に関する情報を使用して、最初のモデル(ユーザー)を介してその結合モデル(メンバーシップ)に取り組みたいと思います。
よろしくお願いします。ありがとうございました。