gpt4 book ai didi

ruby-on-rails - 基于角色的 RESTful 资源的应用程序结构

转载 作者:行者123 更新时间:2023-12-04 06:18:45 27 4
gpt4 key购买 nike

在使用 RESTful 资源路由时,是否有一致的最佳方法来实现用户角色?

假设我有以下资源:

User has_many Tickets
Event has_many Tickets
Ticket belongs_to Person, Event

然后进一步说我有两种类型的用户:客户和代理。两者都将登录系统,但根据其角色具有不同的资源访问权限和功能。例如:

客户可以访问:
  • 事件索引,显示
  • 票证索引(由用户限定)、显示、购买/创建、返回/删除
  • 人物创建、展示、更新

  • 代理可以访问:
  • 事件索引、显示、创建、更新、删除
  • 门票索引、演出、销售/创建、更新、退款/删除
  • 人物索引、显示、创建、更新、删除

  • 以下 4 种通用方法中的哪一种更简洁、更灵活?

    在命名空间中的角色文件夹和资源中分离 Controller ,例如:
    namespace "agent" do
    resources :events, :tickets, :people
    end
    namespace "customer" do
    resources :events, :tickets, :people
    end

    按角色分离 Controller ,例如:
    AgentController
    def sell_ticket, etc

    CustomerController
    def buy_ticket, etc

    在需要时具有单独操作的共享 Controller ,例如:
    TicketController
    before_filter :customer_access, :only => :buy
    before_filter :agent_access, :except => :buy

    def buy #accessed by customer to create ticket

    def sell #accessed by agent to create ticket

    带有条件语句的共享操作,例如:
    TicketController
    def create
    if @role == :customer
    #buy ticket
    elsif @role == :customer
    #sell ticket
    end
    end

    最佳答案

    我建议结合使用最后两个提议的实现。他们坚持 RESTful 表示,他们将授权放在适当的级别( Controller ),这是一个可扩展的实现。

    REST 本质上是关于 accessing nouns with verbs .因此,您希望代理和客户执行与工单、用户和事件(名词)相关的操作(动词)。为了准确地表示这些名词,您应该为每个名词设置一个 Controller 。然后,客户可以通过 URL http://example.com/events/22 识别他们正在寻找的资源。 .从这里你可以使用 Rails 的路由来表示各种资源的上下文,即 http://example.com/events/22/tickets通过做类似的事情:

    resource :events do
    resource :tickets
    end

    通过坚持 RESTful 架构,您购买了 end to end principle .表示对象的范式只需要对此负责。它不应该尝试进行身份验证。那不是它的工作。授权应该发生在 Controller 中。我强烈建议您研究像 CanCan 这样的 gem 。或 Declarative Authorization为您设置了所有这些。

    最后,这个模型可扩展。通过将授权与资源的表示分开,您只需在需要时使用它。这使您的应用程序保持轻便、灵活和简单。

    关于ruby-on-rails - 基于角色的 RESTful 资源的应用程序结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3796505/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com