我有一个Post
模型的应用程序,在路由的admin命名空间下有关联的PostsController
和Admin::PostsController
。控制器与控制器关注点共享相同的index
操作,类似于this approach。我在shared/posts/_posts_list
下使用共享视图部分列出了网站上的所有帖子以及管理信息中心。所有这些都按照我的预期运作。
我想问一下最好的添加方法是什么:仅为管理员用户编辑帖子按钮,该视图不会像<% if current_user.admin? %>
这样的条件变得臃肿,以显示此编辑按钮。
答案 0 :(得分:0)
我说你有两种方法:
你提到的那个。你的观点不应该过于臃肿,这就是我应该选择的观点。
您可以使用current_user.admin吗?检查以放置&#34; is_admin&#34;页面正文中的CSS类。然后,您可以添加&#34; admin_only&#34;类按钮等等,当没有&#34; is_admin&#34;时,使用CSS隐藏相关的按钮和内容。班级存在。
任何一种方法都没问题,但是对于阅读代码的人来说,1更简单一点,并且更加明显,所以我从那开始。有点取决于您的用户界面将拥有多少管理员功能...如果有“堆”,则选项2可能是值得的。
答案 1 :(得分:0)
view.html.erb
<ul>
<%= main_menu_items("main_menu", current_user) %>
</ul>
some_helper.rb
def main_menu_items(menu_name, user = current_user)
allowed_items(menu_name, user).map { |menu_item| content_tag(:li, menu_item) }.join
end
def allowed_items(menu_name, user)
menus = {
main_menu: ["Menu Item 1", "Menu Item 2"],
main_menu_admin: ["Menu Admin Item 1"]
}
menu_to_return = menus[menu_name.to_sym]
menu_to_return += menus[(menu_name + "_admin").to_sym] if user.admin?
end
这只是一些快速代码。如果你想在生产中使用它,你必须做一些重大改变(重构,从模型中获取项目,零检查等)。
答案 2 :(得分:0)
您需要一个授权库(https://github.com/CanCanCommunity/cancancan)
宝石安装
gem 'cancancan', '~> 1.10'
rails g cancan:ability
<强>配置强>
class Ability #model/ability.rb manage roles
include CanCan::Ability
def initialize(user) # user is devise current_user
if user.blank?
else
if user.role_id == 1 # role_id 1 is admin
can :manage, Post #Post is you model
end
end
end
查看强>
<% if can? :update, @post %>
<%= link_to "Edit", edit_post_path(@post) %>
<% end %>
<强>控制器强>
class ArticlesController < ApplicationController
load_and_authorize_resource
def index
@posts = Post.accessible_by(current_ability).order("id ASC") #posts is filtered by current_user's roles
end
def show
# @post is already loaded and authorized
end
end