我有两个模型:用户和角色。一个用户可以有多个角色。
假设用户 1 有角色 1 和角色 2。现在我希望用户 1 具有角色 2 和角色 3。
class User < ActiveRecord::Base
has_and_belongs_to_many :roles
class Role < ActiveRecord::Base
has_and_belongs_to_many :users
这是我的代码
user = User.find(1)
newrole = Role.find(2) #get role3
user.roles[0] = newrole
user.roles[0].save # does not work
user.save # does not work
ruby on rails 解决我的问题的正确方法是什么?
而不是从更新记录role1
到role3
,一个简单的方法是删除记录role1
,并创造新的role2
。
对于has_and_belongs_to_many
,您所需要的只是传递 id,rails 会自动处理它。
例子:
对于 Rails 控制台:
-> @user = User.first
-> puts @user.role_ids
# [1,2]
-> @user.role_ids = [2, 3]
这将通过删除role1
和创建记录来为用户分配新角色role3
edit.html.erb(查看):
让我们假设您有一个表单User
并有一个roles
带有多项选择的下拉列表
<%= form_for(book) do |f| %>
<div class="field">
<%= f.label :first_name %>
<%= f.text_field :first_name %>
</div>
<div class="field">
<%= f.label :roles %>
<%= f.collection_select :role_ids, Role.all, :id, :name, {}, {:multiple => true} %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
users_controller.rb(控制器):
def update
respond_to do |format|
if @user.update(user_params)
format.html { redirect_to @user, notice: 'User was successfully updated.' }
format.json { render :show, status: :ok, location: @user }
else
format.html { render :edit }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
private
def user_params
params.require(:user).permit(:first_name, :last_name, role_ids: [])
end
现在,当您选择role2
androle3
并提交表单时,Rails 将通过删除记录来处理它role1
并为role3
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句