在轨道中设计限制区域时的最佳做法是什么?

时间:2013-08-18 16:26:03

标签: ruby-on-rails model-view-controller devise authorization

对于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这样的授权宝石,但不确定这是否有点过分。

2 个答案:

答案 0 :(得分: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 %>

这是一个非常有用的宝石,并且有很好的记录!

答案 1 :(得分:0)

不是为管理员和访客用户复制视图代码并单独维护它们,您只需拥有一个视图index.html.haml,并且只有在current_user不是- if current_user = link_to 'Edit', edit_path = link_to 'Update', update_path 时才显示编辑,更新和创建等链接零或管理员。

在您看来:

CollectionController

并在def index @collections = Collection.all end

admin.html.haml

这样您就不需要维护两个单独的视图就可以摆脱{{1}}。

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