以下是我的3个模型。使用强参数创建和更新嵌套模型Rails
User
has_many :memberships
has_many :teams, through: :memberships, dependent: :destroy
accepts_nested_attributes_for :memberships
Team
has_many :memberships
has_many :users, through: :memberships, dependent: :destroy
accepts_nested_attributes_for :memberships
Membership
belongs_to :team
belongs_to :user
这是我的团队控制器的一些部分。我的目标是向某个团队添加/更新成员。请注意,添加成员的源已经作为一组用户存在。对于团队控制器
#parameters for team details
def team_params
params.require(:team).permit(:name, :department)
end
#parameters for members (includes leader)
def members_params
params.require(:team).permit(:leader, members:[])
end
#get id values from members_params and store in an array
def member_ids
members_params.values.flatten
end
对于形式
TeamsController
def create
@team = Team.new(team_params)
@team.users << User.find(member_ids) #add leader and members to team
if @team.save
#redirect to created team
else
#show errors
end
end
def update
#TO DO: update team roster here
if @team.update(team_params)
#redirect to updated team
else
#show errors
end
end
强大的参数,我只有:
- 名称(文本字段)
- 系(组合框)
- 领袖(组合框,根据所选部门生成选项,作为选定用户的用户标识提交)
- 成员(组合框,倍数,这取决于所选的部门产生的选项,提交所选择用户的用户ID的阵列)
我可以成功地创建一个团队,与验证的通过一起(团队和会员模式),在我的创作。然而,我不知道如何更新团队,因为如果我使用@team.users.clear
,然后简单地做同样的事情从创建(我知道,这是有点愚蠢),它会验证,但它会保存它,无论如果有错误或没有。
表单代码
<%= form_for(@team, remote: true) do |f| %>
<%= f.label :name, "Name" %>
<%= f.text_field :name %>
<%= f.label :department, "Department" %>
<%= f.select :department, options_for_select(["Architectural", "Interior Design"], department), include_blank: true %>
<%= f.label :leader, "Leader" %>
<%= f.select :leader, select_leaders(department, @team.id), {include_blank: true, selected: pre_select(:leader)} %>
<%= f.label :members, "Members" %>
<%= f.select :members, select_members(department, @team.id), {include_blank: true}, {id: "team_members", multiple: :multiple, data: {member_ids: pre_select(:members)}}%>
<% end %>
注为形式:
- 这种形式适用于这两个空白和填充形式。
:members
字段是select2启用。
所以在这里我的问题是:
- 如何更新小组成员?是否有可能根据我现在强有力的参数进行更新,还是需要修改?
- 我的创建方法是否应该修改?
一些选项导致SOLUTION
选项#1(迄今为止最好的解决方案)
我只是做了这样的急救的解决方案,所以我觉得有一个更好的方法比我在下面做了。我在这里做的是用从member_ids中找到的用户作为值创建用户参数。
TeamsController
def create
team = Team.new(team_params.merge({users: User.find(member_ids)}))
...
end
def update
...
if @team.update(team_params.merge({users: User.find(member_ids)}))
..
end
选项#2
从溶液1独立,我只有team_params
强参数。
TeamsController
...
private
def team_params
params.require(:team).permit(:name, :department, :leader, members:[])
end
我为领导者和成员都创建了setter方法。但是,看起来成员会覆盖领导者设置者,因为我对两个设置者使用了update
方法,并且更新使用了与用户相同的资源。解决方法似乎可以用这个选项。
Team
...
def leader=(leader_id)
#self.update(users: User.find(leader_id))
end
def members=(members_ids)
#self.update(users: User.find(members_id))
end
请张贴您的表单代码,它将通过更清晰地与代码相关来帮助他人理解您的关注。 – Surya 2014-09-01 19:31:09
目前还不清楚,为什么你有两个选择(一个是领导者,一个是成员),然后不存储任何领导者。 – MikDiet 2014-09-02 08:54:47
将会员分为领导和成员,以便用户更好地理解表单。所有成员资格(无论是领导者还是成员)都通过成员资格模型存储为整体成员。我编辑了我的帖子,以便您可以看到我迄今为止所尝试的内容。 – oLraX 2014-09-02 11:18:50