Ruby on rails rails只为管理员显示按钮的最佳方式

Ruby on rails rails只为管理员显示按钮的最佳方式,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我有一个带有Post模型的应用程序,在routes中的Admin命名空间下有关联的PostsController和Admin::PostsController。控制器与控制器关注点共享相同的索引操作,类似于。我正在使用shared/posts/_posts_列表下的共享视图部分来列出站点上以及管理仪表板中的所有帖子。所有这些都像我预期的那样起作用 我在问添加的最佳方法是什么,例如:仅针对管理员用户的edit post按钮,该视图不会因为显示此edit按钮之类的条件而变得臃肿 我想说你有两种方法:

我有一个带有Post模型的应用程序,在routes中的Admin命名空间下有关联的PostsController和Admin::PostsController。控制器与控制器关注点共享相同的索引操作,类似于。我正在使用shared/posts/_posts_列表下的共享视图部分来列出站点上以及管理仪表板中的所有帖子。所有这些都像我预期的那样起作用


我在问添加的最佳方法是什么,例如:仅针对管理员用户的edit post按钮,该视图不会因为显示此edit按钮之类的条件而变得臃肿

我想说你有两种方法:

你提到的那个。你的观点不应该太夸张,这是我赞同的观点

您可以使用当前的_user.admin吗?选中此项可将is_admin CSS类放在页面正文上。然后,您可以将admin_-only类添加到按钮等,并在不存在is_admin类的情况下使用CSS隐藏相关按钮和内容

这两种方法都可以,但是1更简单,而且对任何阅读代码的人来说都更明显,所以我从这开始。有点取决于你的用户界面将有多少只管理的功能。。。如果有堆,选择2可能是值得的

如果你不想在你的视图中加入条件句,那就选两个吧 单独的视图一个用于普通用户,一个用于管理员。 在视图和视图中使用条件句 根据is_admin?包括必要的元素?。如果唯一的条件是_admin,那么这是最短的路径?检查,伊姆霍。如果有更多的条件角色等,你是对的,这将使视图膨胀。您可以检查它是一个大型的开源rails项目,并查看它在视图中是否也使用了条件。检查其基本布局。 您可以根据is_admin?使用帮助程序生成元素?。假设您需要在视图中显示菜单元素。可以在助手中生成菜单元素。您可以从视图中调用帮助器。例如: view.html.erb


这只是一些快速代码。如果您想在生产中使用它,您必须进行一些重大更改—重构、从模型中获取项目、零检查等。

您需要一个授权库

宝石安装

坎坎:能力 配置

看法

控制器


通过CSS隐藏管理员的东西是危险的。你只会隐藏UI元素。您仍然必须以管理员身份登录才能单击按钮并使其在服务器端工作。因此,这不像一个非管理员可以通过简单地更改CSS来获得管理员功能。这如何解决OP所说的问题:…视图不会因为条件而变得臃肿。。?
<ul>
  <%= main_menu_items("main_menu", current_user) %>
</ul>
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
gem 'cancancan', '~> 1.10'
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