rails仅为admin

时间:2015-08-29 09:05:35

标签: ruby-on-rails ruby-on-rails-4

我有一个Post模型的应用程序,在路由的admin命名空间下有关联的PostsControllerAdmin::PostsController。控制器与控制器关注点共享相同的index操作,类似于this approach。我在shared/posts/_posts_list下使用共享视图部分列出了网站上的所有帖子以及管理信息中心。所有这些都按照我的预期运作。

我想问一下最好的添加方法是什么:仅为管理员用户编辑帖子按钮,该视图不会像<% if current_user.admin? %>这样的条件变得臃肿,以显示此编辑按钮。

3 个答案:

答案 0 :(得分:0)

我说你有两种方法:

  1. 你提到的那个。你的观点不应该过于臃肿,这就是我应该选择的观点。

  2. 您可以使用current_user.admin吗?检查以放置&#34; is_admin&#34;页面正文中的CSS类。然后,您可以添加&#34; admin_only&#34;类按钮等等,当没有&#34; is_admin&#34;时,使用CSS隐藏相关的按钮和内容。班级存在。

  3. 任何一种方法都没问题,但是对于阅读代码的人来说,1更简单一点,并且更加明显,所以我从那开始。有点取决于您的用户界面将拥有多少管理员功能...如果有“堆”,则选项2可能是值得的。

答案 1 :(得分:0)

  1. 如果您不想在您的视图中放置条件,请选择两个 单独的视图(一个用于普通用户,一个用于管理员)。
  2. 在视图和中使用条件 根据 is_admin?包含必要的元素。如果唯一的条件是 is_admin? check,imho,这是最短的路要走。如果有更多的条件(角色等)你是对的,这将膨胀视图。您可以检查redmine(这是一个很大的开源rails项目)并看到它在视图中也使用了条件。检查其基本布局here
  3. 您可以使用帮助程序根据 is_admin?生成元素。让我们说你需要在视图中显示菜单元素。您可以在助手中生成菜单元素。您可以从您的视图中调用帮助程序。如:
  4. 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