我在这里阅读了许多其他主题(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
如您所见,我的加入模型Membership有一个附加属性::url
.
在我的Accounts表中,我存储了在线服务的名称,例如 GitHub、Stack Overflow、Twitter、Facebook、LinkedIn。我总共有9个。这是一个固定数量的帐户,我不会经常更新。
在我的用户表单中,我想创建这个:
在这些字段中输入的值应仅在成员资格表中提交,使用 3 个值:
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 %>
我想要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 %>
我正在尝试在 Memberships 表的每一列中手动输入 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 %>
我正在我的用户表单中为我的会员模型创建一个嵌套表单。
它几乎完美地工作:
- 正好 9 个字段,每个帐户一个
- 没有重复
但是,它只有在我的 Memberships 表已经被填充时才有效!(例如使用选项#2)。
所以我尝试使用 UsersController 构建一些实例:
if (@user.memberships.empty?)
@user.memberships.build
end
但是我的 m.label m.object.account.name 行仍然出现此错误。
undefined method `name' for nil:NilClass
无论如何,我可能在这里通过模型遗漏了一些关于 has_many 的内容。我已经设法创建了 has_and_belongs_to_many 关联,但在这里,我想通过第一个模型(用户)使用关于第三个模型(帐户)的信息来处理该连接模型(会员)。
我会很感激你的帮助。谢谢你。