用户组的Rails插件

时间:2010-05-21 06:24:38

标签: ruby-on-rails rubygems ruby-on-rails-plugins

My Rails应用程序具有用户模型和组模型,其中用户属于组。由于这个原因,用户可以是管理员,经理,订户等。

直到最近,例如,当需要在应用上创建新的管理员时,过程只是创建一个新的普通帐户,然后管理员将新普通帐户的 group_id 属性设置为管理员的组ID ...在我的用户控制器中使用某些条件。但我觉得它不是很干净。因为为了安全起见,我需要在(例如)User#update:

中添加这种代码
class UsersController < ApplicationController
  # ...
  def update
    @user = User.find(params[:id])
    # I need to add some lines here, just as on the bottom of the post.
    # I think it's ugly... in my controller. But I can not put this
    # control in the model, because of current_user is not accessible
    # into User model, I think.
    if @user.update_attributes(params[:user])
      flash[:notice] = "yea"
      redirect_to root_path
    else
      render :action => 'edit'
    end
  end
  # ...
end

使用Rails插件有没有干净的方法吗?或者没有......

通过更干净,我认为如果来自User#update的那些行可能会更好:

if current_user.try(:group).try(:level).to_i > @user.try(:group).try(:level).to_i
  if Group.exists?(params[:user][:group_id].to_i)
    if Group.find(params[:user][:group_id].to_i).level < current_user.group.level
      @user.group.id = params[:user][:group_id]
    end
  end
end

...已从控制器中删除,只有当前用户的组级别优于编辑后的用户时,应用程序才能设置组。但也许我错了,也许我的代码还很完美:)

注意:在我的用户模型中,有以下代码:

class User < ActiveRecord::Base
  belongs_to :group
  attr_readonly :group_id
  before_create :first_user
  private
  def first_user
    self.group_id = Group.all.max {|a,b| a.level <=> b.level }.id unless User.exists?
  end
end

你认为这是一个好方法吗?或者你的处理方式不同?

谢谢。

2 个答案:

答案 0 :(得分:0)

如果您有一个用户/组(或用户/角色)模型,那么除了您已加下划线之外别无他法。

如果是o ne-to-many association you can choose to store the user group as a string and if it is a many-to-many association you can go for a bitmask,但无论是通过业务逻辑还是管理员选择,您都需要设置用户/组关系。

如何在视图中设置此关系,您可以有多种选择。

为了扩展您的模型的功能,我建议您使用CanCan,这是一个非常好的授权gem,它可以让您轻松访问rails应用程序中的每个资源。

答案 1 :(得分:0)

我更喜欢控制器方法精简小,并将实际模型逻辑放在模型中(它所属的位置)。

在你的控制器中,我会按照

的方式写一些内容
def update
  @user = User.find(params[:id]
  if @user.can_be_updated_by? current_user
    @user.set_group params[:user][:group_id], current_user.group.level
  end
  # remove group_id from hash
  params[:user].remove_key(:group_id)
  if @user.update_attributes(params[:user])
     ... as before
end

在你的模型中你会有

def can_be_updated_by? (other_user)
  other_user.try(:group).try(:level).to_i > self.try(:group).try(:level).to_i
end

def set_group(group_id, allowed_level)
  group = Group.find(group_id.to_i)
  self.group = group if group.present? && group.level < allowed_level
end

这有帮助吗?