我在User
班级和Role
班级之间存在多对多关系(通过加入表UserRole
)。这样我就可以将我的应用程序的部分限制为没有特定角色的用户,并且具有这些角色的用户可以访问。这是通过User
类方法设置角色的方法:
def add_role(role)
self.user_roles.build(role_id: Role.find_by(role: role).id )
end
因此user_312.add_role('general')
会将general
的角色添加到user_312
的角色中。 (请注意,这与状态机不同,因为用户可以同时拥有许多不同的角色。)
我唯一感到困难的是如何创建一个向用户添加角色的界面。这是我的user#edit
操作及其生成的视图:
控制器:
def edit
# maybe this should be a helper method?
roles = Role.all
@role_names = []
roles.each do |role|
@role_names << role.role
end
end
视图:
<%= form_for(@user) do |f| %>
<div class="field">
Current Roles: <br>
Add Roles: <br>
<%= f.label :roles %><br>
<%= f.select :roles, @role_names %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
这为我提供了一个包含所有角色名称的精彩下拉列表,但我不知道在我的user#update
操作中应该添加什么来创建所选关系:
def update
respond_to do |format|
if @user.update(user_params)
format.html { redirect_to @user, notice: 'User was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
那么我应该在此更新操作中做些什么?
答案 0 :(得分:0)
[重构]您最好使用<<
ActiveRecord method为roles
设置user
:
def add_role(role)
new_role = Role.find_by role: role
current_user.roles << new_role
end
在阅读完整个问题之后,这就是我要做的事情(非常简单):
#app/views/users/roles.html.erb
<%= form_for(@user) do |f| %>
<div class="field">
Current Roles: <br>
Add Roles: <br>
<%= f.label :roles %><br>
<%= f.collection_select :roles, Role.all, :id, :role, prompt: true
<div class="actions">
<%= f.submit %>
</div>
<% end %>
#app/controllers/users_controller.rb
def update
roles = params[:user][:roles]
if roles.any?
roles = Role.find(roles)
current_user.roles << roles
end
end
您将从中受益更多元素,但这是我开始的地方