2

对 Rails 很陌生,我想从社区那里获得一些关于如何设置受限区域的建议。我刚开始使用 Devise 并阅读了一些基于用户是否登录来重定向/渲染视图的不同方法,我想知道最好的方法是什么。

目前,当我希望登录用户对页面有不同的视图时,非登录用户我一直在控制器中处理它。例如:

class CollectionsController < ApplicationController
  before_filter :authenticate_user!, except: [:index, :show]

  def index
    @collections = Collection.all

    if current_user
      render :admin
    else
      render :index
    end
  end
end

在这种情况下:admin,和分别:index对应于views/collections/admin.html.hamlviews/collections/index.html.haml。管理视图在布局上与索引视图相似,但具有指向编辑、更新、创建等的链接。

这是最好的方法吗?

编辑:我也在考虑尝试像 CanCan 这样的授权宝石,但不确定这是否会矫枉过正。

4

2 回答 2

0

如果你想让你的代码保持良好和干燥,我建议你检查一下CanCan - 你目前这样做的方式会导致大量重复代码并且可能变得难以管理。安装后,CanCan 将生成一个“能力”文件,您可以在其中定义用户可以做什么或不可以做什么。例如,在你的情况下,你可能有

def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.admin?
      can :manage, :all
    else
      can :read, :all
    end
  end

然后在你的视图中,你可以做一个简单的检查,看看用户是否有能力修改那个对象。例如:

<% if can? :create, Project %>
  <%= link_to "New Project", new_project_path %>
<% end %>

这是一个超级有用的宝石,并且有很好的文档记录!

于 2013-08-18T16:39:39.723 回答
0

无需为管理员和访客用户复制视图代码并分别维护它们,您可以只拥有一个视图index.html.haml并显示编辑、更新和创建等链接,除非current_user它不是 nil 或管理员。

在您看来:

- if current_user 
  = link_to 'Edit', edit_path
  = link_to 'Update', update_path

在你的CollectionController

def index
  @collections = Collection.all
end

这样您就不需要维护两个单独的视图,并且可以摆脱admin.html.haml.

是的,如果您有许多不同的地方需要实现这些逻辑,那么按照@Anchor 的建议实现 CanCan gem 可能是可行的方法。

于 2013-08-18T16:42:12.413 回答