在Devise中创建属于另一个用户的用户?

cdo*_*eli 3 ruby-on-rails devise

我正在尝试用2个用户级别创建一个简单的博客应用程序:"writer"和"manager"

作家属于经理人,经理可以有很多作家.

作家只能看到他们自己的帖子,但经理可以看到他们作家的所有帖子.

现在我的问题是,我应该如何实现这种类型的系统?

我很确定我应该使用Devise来生成用户身份验证.但是,我应该为每种类型的用户(作家或模型)生成单独的模型,还是应该生成角色表?

我不知道这是否足够具体; 我花了一天时间在这上面没有任何解决方案,所以如果你需要了解更多,请告诉我,我会在评论中回答.提前致谢

Max*_*yak 7

听起来像一个简单的用户表manager_id.

create_table :users do |t|
  # ...other columns...

  t.integer :manager_id
end

class User < ActiveRecord::Base
  # Returns all writers under this manager
  has_many :writers, :class_name => 'User', :foreign_key => :manager_id

  # Returns this writer's manager
  belongs_to :manager, :class_name => 'User'

  # Allows this user to be author of posts
  has_many :posts

  # Associates posts of all writers under this manager
  has_many :writers_posts, :through => :writers, :class_name => 'Post'

  # If user has no manager, she's a manager
  def manager?
    manager_id.nil?
  end

  # If user has a manager, she's a writer
  def writer?
    !manager?
  end
end
Run Code Online (Sandbox Code Playgroud)

这允许您与用户进行以下操作.

if @user.manager?
  @user.writers # => [<User>, <User>, ...]
  @user.writers_posts # => [<Post>, <Post>, ...]
end

if @user.writer?
  @user.manager # => <User>
end
Run Code Online (Sandbox Code Playgroud)

该实现仅通过管理器的存在来确定用户是管理员还是作者.如果用户有经理,她必须是作家.不过,她是一名经理.如果这不够灵活,您可以添加额外的布尔列,指定用户是一个,另一个,还是两者.另请注意,这只是一个User包含编写器和管理器方法的模型.所以你可以调用@writer.writers_posts(这不适合作家用户),但你不应该.

认证

由于您拥有的只是常规User模型,因此您可以按照任何Devise教程为其设置身份验证.作家和经理都只是简单登录的用户.

授权

就权限和帖子可见性而言,这一切都归结为能够在当前用户上调用上述方法.

if current_user.manager?
  current_user.writers_posts.each do |post|
    # display post
  end
end
Run Code Online (Sandbox Code Playgroud)

坦率地说,CanCan是一种矫枉过正的行为.您需要做的就是在视图中添加before_filter一些if current_user.manager?条件.CanCan更全面,根据我的经验,它在大多数应用程序中都太多了.