我目前有一个非常简单的设计,使用 Ruby 2.0 和 Rails 4 beta 创建。
我有用户和组。一个用户可以是多个组的成员,一个组可以有多个用户作为成员。因此,我有一个联接模型 UserGroup,它只包含 user_id 和 group_id。如下:
class User < ActiveRecord::Base
has_many :user_groups, dependent: destroy
has_many :groups, through: :user_groups
accepts_nested_attributes_for :user_groups, allow_destroy: true
end
class Group < ActiveRecord::Base
has_many :user_groups, dependent: destroy
has_many :users, through: :user_groups
end
class UserGroup < ActiveRecord::Base
belongs_to :user, inverse_of: :user_groups
belongs_to :group, inverse_of: :user_groups
validates :user_id, presence: true
validates :group_id, presence: true
end
我发现了很多关于accepts_nested_attributes_for 的东西,这似乎表明在创建/更新时创建了一个关联对象。我想要的是一个多选项选择框,我可以从当前系统中我希望用户成为成员的所有组的列表中选择多个选项,并在提交时为我生成所有 user_group 关联。
我无法在控制器或视图中计算出我需要什么来利用这一点。我目前有:
<%= form_for(@user) do |f| %>
<div class="field">
<%= f.label :username %><br />
<%= f.text_field(:username) %>
</div>
<div class="field">
<%= f.label :group_ids, 'Group memberships' %><br />
<%= f.select :group_ids, @groups.collect {|g| [g.name, g.id]}, {}, multiple: true %>
</div>
<% end %>
在视图中并且:
def create
@user = User.new(user_params)
@user.save
end
def user_params
params.require(:user).permit(:forename, :surname, :email, :group_ids)
end
在我的控制器中(当然还有我现在没有测试的所有其他操作)。
这是行不通的。当我转到具有组成员身份的现有用户的编辑页面时,他们会在多项目选择框中正确显示,但更改成员资格或在新用户上设置它们不起作用。我的用户对象已保存,但没有创建或销毁任何相关的 user_group 对象。谁能告诉我我在这里做错了什么以及我需要做什么才能让它工作?在过去的几个小时里,我一直在搜寻 StackOverflow 和 Google,但一无所获......