cdo*_*eli 3 ruby-on-rails devise
我正在尝试用2个用户级别创建一个简单的博客应用程序:"writer"和"manager"
作家属于经理人,经理可以有很多作家.
作家只能看到他们自己的帖子,但经理可以看到他们作家的所有帖子.
现在我的问题是,我应该如何实现这种类型的系统?
我很确定我应该使用Devise来生成用户身份验证.但是,我应该为每种类型的用户(作家或模型)生成单独的模型,还是应该生成角色表?
我不知道这是否足够具体; 我花了一天时间在这上面没有任何解决方案,所以如果你需要了解更多,请告诉我,我会在评论中回答.提前致谢
听起来像一个简单的用户表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更全面,根据我的经验,它在大多数应用程序中都太多了.