根据情况确定铁路路线

2023-12-20

我有三个角色:教师、学生、管理员,每个角色都有带有“主页”视图的控制器。

所以这工作正常,

get "instructor/home", :to => "instructor#home"
get "student/home", :to => "student#home"
get "admin/home", :to => "admin#home"

我想写一个像下面这样的虚荣网址,它将根据角色的角色进行路由user_id到正确的主页。

get "/:user_id/home", :to => "instructor#home" or "student#home" or "admin#home"

我该如何实现这个目标?


我提供了一种替代方法,因为在 Rails 中搜索基于角色的路由时,这个问题出现在顶部附近。

我最近需要实现类似的东西,但希望避免控制器中存在大量条件 - 由于我的每个用户角色都需要加载和呈现完全不同的数据,这一事实使情况变得更加复杂。我选择使用以下方法将决策逻辑移至路由层路由约束 http://guides.rubyonrails.org/routing.html#advanced-constraints.

# app/constraints/role_route_constraint.rb

class RoleRouteConstraint
  def initialize(&block)
    @block = block || lambda { |user| true }
  end

  def matches?(request)
    user = current_user(request)
    user.present? && @block.call(user)
  end

  def current_user(request)
    User.find_by_id(request.session[:user_id])
  end
end

上面代码中最重要的部分是matches?方法将确定路由是否匹配。该方法通过request对象,其中包含有关所发出请求的各种信息。就我而言,我正在查找:user_id存储在会话 cookie 中并使用它来查找发出请求的用户。

然后,您可以在定义路线时使用此约束。

# config/routes.rb
Rails.application.routes.draw do
  get 'home', to: 'administrators#home', constraints: RoleRouteConstraint.new { |user| user.admin? }
  get 'home', to: 'instructors#home', constraints: RoleRouteConstraint.new { |user| user.instructor? }
  get 'home', to: 'students#home', constraints: RoleRouteConstraint.new { |user| user.student? }  
end

完成上述操作后,管理员可以请求/home将被路由到home的行动AdministratorsController,一位讲师提出请求/home将被路由到home的行动InstructorsController,以及一名学生提出请求/home将被路由到home的行动StudentsController.

更多信息

如果您正在寻找更多信息,我最近在my blog http://bjedrocha.com/rails/2015/03/18/role-based-routing-in-rails/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据情况确定铁路路线 的相关文章

随机推荐

  • JIT 如何在运行时替换优化的机器代码?

    我正在浏览 OpenJDK 源代码 但找不到替换优化代码的地方 我想知道如何在保护模式下完成此操作 这不是操作系统应该阻止的某种自我修改代码吗 JITer 在堆或堆栈中分配空间 并将汇编代码插入其中 不 自我修改代码完全没问题 Virtua
  • 为什么过剩如此严重?

    尽管 openFrameworks 使用了 GLUT 但我看到了很多关于 GLUT 的不好的评论 Cinder 开发人员表示 他们希望尽可能远离 GLUT 那么它有什么不好呢 你永远不应该使用actual过剩 自 2001 年左右以来 它就
  • 我可以在该服务中动态创建的嵌套对象中设置该服务的 this.'something' 吗? (可能是范围问题)

    我有以下服务 它实际上有更多级别和元素 但我将其精简为我想要工作的一个示例 它根据 app data 文件夹中的 csv 文件动态地在其他对象中创建 javascript 对象 与这个问题最相关的行是this images images 在
  • 如何在 swift iOS 中为以下 JSON 响应创建模型类

    你好 我是 swift ios 的初学者 我的要求是必须显示对表列表的 Json 响应 我从网络服务收到响应 响应如下所示 我的要求是如何将模型类映射到数组以及如何在 tableList 中显示它们可以有人帮助我吗 Json响应 id 54
  • DataContext 未绑定在 Style.Trigger 中

    所以我有一些类似于以下的代码 请原谅任何拼写错误 我试图在帖子的 SO 编辑器中进行简化
  • pygame.event.get() 在线程内时不返回任何事件

    所以我有这段代码来处理吃豆人风格游戏的用户输入 def receiving inputs self while True events pg event get for event in events if event type pg KE
  • 如何在 VB.NET 中从资源播放 .wav

    我正在完善一个 VB NET 刽子手游戏 我添加了当你赢得比赛时火鸡狼吞虎咽的声音 当你获胜时 这是我的循环 Dim sndPing As New SoundPlayer My Resources turkey sndPing Play M
  • 使用 WS4J 进行句子相似度

    我想使用 ws4j 计算两个句子之间的相似度 我正在使用 WS4J 的在线演示 WS4J 在线演示 http ws4jdemo appspot com br I am using the default example sentences
  • 将 %20 替换为破折号

    当我回显下面的变量时 空格表示为 20 row title 所以 举例来说 如果 row title 等于 葡萄牙粉碎朝鲜 它的回响是Portugal 20Crushes 20North 20Korea 在我的源代码中 我如何替换每个 20
  • Netbeans JDK 校准 8.1

    如何使用 Netbeans 8 1 进行 JDK 校准 我用谷歌搜索了一些并找到了这个链接here https profiler netbeans org docs help 5 5 calibration html 它说 选择配置文件 g
  • 如何将 NSInteger 转换为 int?

    例如当通过一个value发消息给NSInteger像这样的实例 a value 它会导致 EXC BAD ACCESS 那么如何转换NSInteger to int 如果相关 则仅使用 Ta da NSInteger myInteger 4
  • 动态(取消)链接正在运行的(gstreamer)管道中的元素?

    gstreamer 文档中有大量有关构建和运行静态管道的示例 但是 关于更改 重新链接元素中的内容并不多live管道 当介质实际流动时 这绝对是可能的 所以问题是 在尝试此操作之前我应该 了解哪些 gstreamer 概念 机制 有什么需要
  • 创建对象实例而不调用构造函数?

    在 C 中 有没有一种方法可以实例化类的实例而不调用其构造函数 假设该类是公共的 并且是在第三方库中定义的 并且构造函数是内部的 我想要这样做的原因很复杂 但了解是否可以使用某种 C hackery 会很有帮助 注意 我特别不想调用任何构造
  • 将数据类型 TYPE_4BYTE_ABGR 的字节数组转换为 BufferedImage

    我有一个类型为 TYPE 4BYTE ABGR 的字节数组 并且我知道它的宽度和高度 我想将其更改为 BufferedImage 有什么想法吗 最快的创建方法BufferedImage从字节数组中TYPE 4BYTE ABGR形式 是将数组
  • Opengl Iphone SDK:如何判断您是否正在触摸屏幕上的物体?

    首先是 TouchBegan 函数 然后是存储对象值的结构 我有一个由这些对象组成的数组 我试图弄清楚当我触摸屏幕时是否正在触摸屏幕上的对象 我不知道是否需要通过迭代所有对象并弄清楚我是否以这种方式触摸对象来做到这一点 或者也许有一种更简单
  • htaccess mod_rewrite:重定向所有子域,排除一些

    有很多类似的问题 但我找不到这个具体问题的答案 在我的 htaccess 中 我重写了将所有子域重定向到http example com http example com RewriteCond HTTP HOST example com
  • 是“使用 std::begin;”一个好的做法?

    据我读到 begin some vector 比更标准some vector begin 因为数组支持 而且据我所知 使用using keyword这并不是真正理想的行为 但是 我也看到很多代码只包含这两个usings using std
  • Spring Boot 应用程序在启动时终止

    我正在尝试一个简单的 Spring Boot 应用程序 它总是自动关闭 Spring Boot v1 4 1 RELEASE 2016 10 23 13 05 21 681 INFO 16532 main com example RestB
  • 从 Oracle 实例创建内存数据库结构

    我有一个应用程序 其中有很多 unit 测试在执行期间使用与 Oracle 数据库的真实连接 正如您可以想象的那样 这些测试需要花费太多时间来执行 因为它们需要初始化一些 Spring 上下文 并与 Oracle 实例进行通信 除此之外 我
  • 根据情况确定铁路路线

    我有三个角色 教师 学生 管理员 每个角色都有带有 主页 视图的控制器 所以这工作正常 get instructor home to gt instructor home get student home to gt student hom