加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 基于current_user的Rails路由范围默认值

发布时间:2020-12-17 03:31:20 所属栏目:百科 来源:网络整理
导读:我有一条路线: scope ":department",department: /admin|english|math/,defaults: { department: 'admin' } 是否可以使此路由的默认部门基于current_user.department.name? 如果这是不可能的,那么解决我的问题的另一种方法是什么.问题是除非另有说明,否则
我有一条路线:

scope ":department",department: /admin|english|math/,defaults: { department: 'admin' }

是否可以使此路由的默认部门基于current_user.department.name?

如果这是不可能的,那么解决我的问题的另一种方法是什么.问题是除非另有说明,否则我希望所有链接都默认为当前范围.我目前在很多地方做以下事情:

# links to /math/students
link_to 'students',students_path(department: current_user.department.name.downcase)

解决方法

如果我理解正确,你想要的是能够写:

link_to’students’,students_path

并根据当前用户自动设置部门选项.

这是一个解决方案,就像其他一些提供的解决方案:为每个需要部门的路线定义帮助器.但是,我们可以以编程方式执行此操作.

开始了:
应用程序/佣工/ url_helper.rb

module UrlHelper

  Rails.application.routes.routes.named_routes.values.
    select{ |route| route.parts.include?(:department) }.each do |route|
      define_method :"department_#{route.name}_path" do |*args|
        opts = args.extract_options!
        if args.size > 0
          keys = route.parts - [:department]
          opts.merge!(Hash[*keys.zip(args).flatten])
        end
        opts.reverse_merge!(department: current_user.department.name.downcase)
        Rails.application.routes.url_helpers.send(:"#{route.name}_path",opts)
      end
  end

end

现在,对于每个具有:department路径段的路由,您都有诸如department_students_path之类的辅助方法.这些将像students_path一样工作 – 您可以传入opts,甚至可以显式设置:部门,它将覆盖默认值.并且他们会及时更新您的routes.rb而无需维护它.

您甚至可以将它们命名为与原始助手相同,即

define_method:“#{route.name} _path”

不必在部门前面添加前缀_–我没有这样做,因为我宁愿避免命名那样的冲突.我不确定它是如何工作的(当从视图模板中调用方法时,哪种方法会赢得方法查找),但你可能会研究它.

您当然可以为_url辅助方法重复此块,因此除了_path之外,您还可以使用这些方法.

要使控制器和视图上的助手可用,只需在ApplicationController中包含UrlHelper即可.

所以我认为这符合您的标准:

>您可以为作用域的路径调用辅助方法:department,默认为current_user的部门,这样您就不必每次都明确指定它.>帮助程序是通过元编程生成的,基于实际定义的命名路由,它们具有:部门段,因此您不必维护它们.>就像内置的rails url_helpers一样,这些人可以为其他路径段采用位置args,例如department_student_path(@student).但是,一个限制是,如果要覆盖部门,则需要在最终的opts哈希中执行此操作(department_student_path(@student,department:’math’)).再说一遍,在这种情况下,你总是可以做student_path(‘math’,@ student),所以我认为这不是一个限制.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读