我正在使用Devise和CanCan使用Rails 4构建应用程序。当新用户注册时,他们没有被赋予默认角色。管理员必须通过管理面板手动分配它。这就是我遇到困难的地方。我无法弄清楚如何更新连接字段中的数据。这是我到目前为止所拥有的。
我的UsersController:
class UsersController < ApplicationController
before_filter :authenticate_user!
before_action :set_user, only: [:show, :update, :destroy]
def index
authorize! :index, @user, message: 'Not authorized as an administrator.'
@users = User.all
end
def show
end
def update
authorize! :update, @user, message: 'Not authorized as an administrator.'
if @user.update_attributes(user_params)
redirect_to users_path, notice: "User updated."
else
redirect_to users_path, alert: "Unable to update user."
end
end
def destroy
authorize! :destroy, @user, message: 'Not authorized as an administrator.'
unless @user == current_user
@user.destroy
redirect_to users_path, notice: "User deleted."
else
redirect_to users_path, notice: "Can't delete yourself."
end
end
private
def set_user
@user = User.find(params[:id])
end
def user_params
params.require(:user).permit(:name, :email, :role_id, :user_id)
end
end
我的榜样:
class Role < ActiveRecord::Base
has_and_belongs_to_many :users, :join_table => :users_roles
belongs_to :resource, :polymorphic => true
scopify
end
我的用户模型:
class User < ActiveRecord::Base
rolify
# Include default devise modules. Others available are:
# :token_authenticatable, :confirmable,
# :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
end
正如您所看到的,它几乎是Devise生成的标准模型。
这是我用来更新角色的形式:
<div id="role-options-<%= user.id %>" class="reveal-modal medium" style="display: none;">
<%= simple_form_for user, url: user_path(user), html: {method: :put, class: 'custom' } do |f| %>
<h3>Change Role</h3>
<%= f.input :role_ids, collection: Role.all, as: :radio_buttons, label_method: lambda {|t| t.name.titleize}, label: false, item_wrapper_class: 'inline', checked: user.role_ids.first %>
<%= f.submit "Change Role", class: "small button" %>
<a class="close-reveal-modal" href="#">Close</a>
<% end %>
</div>
当我在表单上检查新角色并提交时,我被重定向到用户页面,并显示“用户已更新”消息。但是,用户角色尚未更新。
我仍然是Rails的新手,并且无法弄清楚我做错了什么。如果我理解正确,我需要更新user_roles表中的数据。我无法弄清楚我做错了什么。
答案 0 :(得分:2)
您正在使用字符串参数,但忘记将role_ids添加到允许的字段中。
所以,你的控制器应该包含这样的东西(如果是role_ids是一个数组):
def user_params
params.require(:user).permit(:name, :email, :role_ids => [])
end
或者如果role_ids是标量,只需删除=> []
部分。
答案 1 :(得分:0)
我不确定rolify会做什么。但我会这样做:
class User
has_one :users_roles
has_one :role, through: :users_roles
虽然我不确定。但是你可以尝试一下。我知道has_one :users_roles
很奇怪。