Rails 4 - Pundit - 如何编写范围

2023-12-29

我正在尝试学习如何将 Pundit 与 Rails 4 结合使用。过去 2 年我一直在尝试学习这一点,并且正在慢慢取得一点点进展。

我也在尝试学习如何编写范围。我仍在尝试找出如何将建议翻译成简单的英语,以便我可以开始理解。

我陷入了专家策略使用的范围和我可以在模型中编写的一般范围类的交集。

我有用户、配置文件和项目的模型。

这些协会是:

User

has_one :profile

Profile

belongs_to :user
has_many :projects

Project

belongs_to :profile

我正在尝试编写一个专家策略,允许不同的用户查看不同的项目。我正在编写一个范围内的政策,由专家来管理这个问题。

在我的项目模型中,我试图编写查找所有用户项目的范围。用简单的英语来说,我想搜索所有项目,查找那些配置文件 ID 属于等于当前用户的用户 ID 的项目。

在我的专家政策中,我试图编写这个解析方法:

class Scope
    attr_reader :user, :scope

    def initialize(user, scope)
      @user  = user
      @scope = scope
    end

    def resolve
      if user.has_role?(:admin)
        scope.all
      elsif user.id == @project.profile.user_id
        scope.projects_for_user 
      elsif user.present?
        scope.in_state(:publish)
      else 
        Project.none  
      end
    end
  end

我尝试了大约 100 种不同的方法来尝试在我的项目模型上编写范围来查找属于当前用户的项目。我知道我不能在模型中使用 devise 的 current_user,所以我不能在范围内使用它。这两个是我最好的尝试——都错了。

scope :projects_for_user, -> { joins(:user_id).where('project.profile.user_id = ?', user.id) }

scope :projects_for_user, -> { where(project.profile.user_id: User.id) }

我学习这一点的主要问题是我不知道如何将这条线解构为不同的部分。

据我所知,“:”之前的部分是您正在寻找的东西。 “:”后面的位是您运行作用域时使用的实例。如果这是正确的,那么我对为什么我的第二次尝试不起作用(并且对第一次尝试中的 join 语句也非常困惑)感到困惑。

如果有人可以帮助用简单的英语解释如何编写范围,我相信我知道我想要寻找什么,只是绝望地迷失了如何编写查询来查找它。

目前,当我尝试使用我的项目策略时(我尝试合并下面 Taryn 的建议 - 尽管我不理解范围的每个组成部分,所以我不确定它发生了什么)。

class ProjectPolicy < ApplicationPolicy

  attr_reader :user, :record

  class Scope
    attr_reader :user, :scope

    def initialize(user, scope)
      @user  = user
      @scope = scope
    end

    def resolve
      if user.has_role?(:admin)
        scope.all
      elsif user.id == @project.profile.user_id
        scope.projects_for_user(user)  
      elsif user.present?
        scope.in_state(:publish)
      else 
        Project.none  
      end
    end
  end


  def index?
    true
  end

  def show?
    true
  end

private
  def project
    record
  end

项目型号:

scope :projects_for_user, -> (user){ joins(:user_id).where('project.profile.user_id = ?', user.id) }

在我的项目控制器中,我有:

class ProjectsController < ApplicationController

  before_action :set_project, only: [:show, :edit, :update, :destroy ]
  before_action :authenticate_user!

  def index
    @projects = Project.all
    authorize @projects
  end

  def show
    @project = Project.find(params[:id])
    # authorize @project

  end

private
    def set_project
      @project = Project.find(params[:id])
      authorize @project
    end

当我保存并尝试时,它给出了一个错误:

wrong number of arguments (given 2, expected 0)

当我尝试查看项目或特定项目的索引时,会返回此错误(所以我认为这与范围无关)。我不明白给出哪两个论点来知道如何尝试解决这个问题。

添加堆栈跟踪

ArgumentError - wrong number of arguments (given 2, expected 0):
  pundit (1.1.0) lib/pundit.rb:112:in `policy!'
  pundit (1.1.0) lib/pundit.rb:235:in `policy'
  pundit (1.1.0) lib/pundit.rb:194:in `authorize'
  app/controllers/eois_controller.rb:20:in `show'
  actionpack (4.2.4) lib/action_controller/metal/implicit_render.rb:4:in `send_action'
  actionpack (4.2.4) lib/abstract_controller/base.rb:198:in `process_action'
  actionpack (4.2.4) lib/action_controller/metal/rendering.rb:10:in `process_action'
  actionpack (4.2.4) lib/abstract_controller/callbacks.rb:20:in `block in process_action'
  activesupport (4.2.4) lib/active_support/callbacks.rb:117:in `call'
  activesupport (4.2.4) lib/active_support/callbacks.rb:555:in `block (2 levels) in compile'
  activesupport (4.2.4) lib/active_support/callbacks.rb:505:in `call'
  activesupport (4.2.4) lib/active_support/callbacks.rb:92:in `__run_callbacks__'
  activesupport (4.2.4) lib/active_support/callbacks.rb:778:in `_run_process_action_callbacks'
  activesupport (4.2.4) lib/active_support/callbacks.rb:81:in `run_callbacks'
  actionpack (4.2.4) lib/abstract_controller/callbacks.rb:19:in `process_action'
  actionpack (4.2.4) lib/action_controller/metal/rescue.rb:29:in `process_action'
  actionpack (4.2.4) lib/action_controller/metal/instrumentation.rb:32:in `block in process_action'
  activesupport (4.2.4) lib/active_support/notifications.rb:164:in `block in instrument'
  activesupport (4.2.4) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
  activesupport (4.2.4) lib/active_support/notifications.rb:164:in `instrument'
  actionpack (4.2.4) lib/action_controller/metal/instrumentation.rb:30:in `process_action'
  actionpack (4.2.4) lib/action_controller/metal/params_wrapper.rb:250:in `process_action'
  searchkick (1.3.0) lib/searchkick/logging.rb:153:in `process_action'
  activerecord (4.2.4) lib/active_record/railties/controller_runtime.rb:18:in `process_action'
  actionpack (4.2.4) lib/abstract_controller/base.rb:137:in `process'
  actionview (4.2.4) lib/action_view/rendering.rb:30:in `process'
  actionpack (4.2.4) lib/action_controller/metal.rb:196:in `dispatch'
  actionpack (4.2.4) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
  actionpack (4.2.4) lib/action_controller/metal.rb:237:in `block in action'
  actionpack (4.2.4) lib/action_dispatch/routing/route_set.rb:76:in `dispatch'
  actionpack (4.2.4) lib/action_dispatch/routing/route_set.rb:45:in `serve'
  actionpack (4.2.4) lib/action_dispatch/journey/router.rb:43:in `block in serve'
  actionpack (4.2.4) lib/action_dispatch/journey/router.rb:30:in `serve'
  actionpack (4.2.4) lib/action_dispatch/routing/route_set.rb:821:in `call'
  omniauth (1.3.1) lib/omniauth/strategy.rb:186:in `call!'
  omniauth (1.3.1) lib/omniauth/strategy.rb:164:in `call'
  omniauth (1.3.1) lib/omniauth/strategy.rb:186:in `call!'
  omniauth (1.3.1) lib/omniauth/strategy.rb:164:in `call'
  omniauth (1.3.1) lib/omniauth/strategy.rb:186:in `call!'
  omniauth (1.3.1) lib/omniauth/strategy.rb:164:in `call'
  omniauth (1.3.1) lib/omniauth/strategy.rb:186:in `call!'
  omniauth (1.3.1) lib/omniauth/strategy.rb:164:in `call'
  meta_request (0.4.0) lib/meta_request/middlewares/app_request_handler.rb:13:in `call'
  meta_request (0.4.0) lib/meta_request/middlewares/meta_request_handler.rb:13:in `call'
  warden (1.2.6) lib/warden/manager.rb:35:in `block in call'
  warden (1.2.6) lib/warden/manager.rb:34:in `call'
  rack (1.6.4) lib/rack/etag.rb:24:in `call'
  rack (1.6.4) lib/rack/conditionalget.rb:25:in `call'
  rack (1.6.4) lib/rack/head.rb:13:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/params_parser.rb:27:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/flash.rb:260:in `call'
  rack (1.6.4) lib/rack/session/abstract/id.rb:225:in `context'
  rack (1.6.4) lib/rack/session/abstract/id.rb:220:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/cookies.rb:560:in `call'
  activerecord (4.2.4) lib/active_record/query_cache.rb:36:in `call'
  activerecord (4.2.4) lib/active_record/connection_adapters/abstract/connection_pool.rb:653:in `call'
  activerecord (4.2.4) lib/active_record/migration.rb:377:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
  activesupport (4.2.4) lib/active_support/callbacks.rb:88:in `__run_callbacks__'
  activesupport (4.2.4) lib/active_support/callbacks.rb:778:in `_run_call_callbacks'
  activesupport (4.2.4) lib/active_support/callbacks.rb:81:in `run_callbacks'
  actionpack (4.2.4) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/reloader.rb:73:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/remote_ip.rb:78:in `call'
  better_errors (2.1.1) lib/better_errors/middleware.rb:84:in `protected_app_call'
  better_errors (2.1.1) lib/better_errors/middleware.rb:79:in `better_errors_call'
  better_errors (2.1.1) lib/better_errors/middleware.rb:57:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
  rack-contrib (1.4.0) lib/rack/contrib/response_headers.rb:17:in `call'
  meta_request (0.4.0) lib/meta_request/middlewares/headers.rb:16:in `call'
  web-console (2.3.0) lib/web_console/middleware.rb:28:in `block in call'
  web-console (2.3.0) lib/web_console/middleware.rb:18:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  railties (4.2.4) lib/rails/rack/logger.rb:38:in `call_app'
  railties (4.2.4) lib/rails/rack/logger.rb:20:in `block in call'
  activesupport (4.2.4) lib/active_support/tagged_logging.rb:68:in `block in tagged'
  activesupport (4.2.4) lib/active_support/tagged_logging.rb:26:in `tagged'
  activesupport (4.2.4) lib/active_support/tagged_logging.rb:68:in `tagged'
  railties (4.2.4) lib/rails/rack/logger.rb:20:in `call'
  request_store (1.3.1) lib/request_store/middleware.rb:9:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/request_id.rb:21:in `call'
  rack (1.6.4) lib/rack/methodoverride.rb:22:in `call'
  rack (1.6.4) lib/rack/runtime.rb:18:in `call'
  activesupport (4.2.4) lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call'
  rack (1.6.4) lib/rack/lock.rb:17:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/static.rb:116:in `call'
  rack (1.6.4) lib/rack/sendfile.rb:113:in `call'
  skylight (0.10.6) lib/skylight/middleware.rb:61:in `call'
  railties (4.2.4) lib/rails/engine.rb:518:in `call'
  railties (4.2.4) lib/rails/application.rb:165:in `call'
  rack (1.6.4) lib/rack/content_length.rb:15:in `call'
  puma (3.4.0) lib/puma/configuration.rb:224:in `call'
  puma (3.4.0) lib/puma/server.rb:569:in `handle_request'
  puma (3.4.0) lib/puma/server.rb:406:in `process_client'
  puma (3.4.0) lib/puma/server.rb:271:in `block in run'
  puma (3.4.0) lib/puma/thread_pool.rb:114:in `block in spawn_thread'

于 2016-09-08 13:23:01 +1000 开始为 ::1 发布“/__better_errors/123578515c1e4e10/variables”

堆栈跟踪分析

我自己编写的唯一一行是 eois 控制器中的授权 @eoi 行(在 show 操作内)。这是使用 pundit 的关键部分。堆栈跟踪的其余部分来自我没有编写且不知道如何更改的内容。

 app/controllers/eois_controller.rb:20:in `show'

对可能的重复标签的响应

另一个问题也是我发布的。他们要去不同的地方。在这篇文章中,我想也许我写的范围是错误的(我可能是这样)。在另一篇文章中,我试图列出整个过程,看看是否有人能够帮助我理解我哪里出了问题。


问题是您实际上并没有为范围提供用户 ID。在这一篇中:User.id这永远不会起作用...User类代表all用户...询问它的 id 没有任何意义(您只会返回存储类方法的 ruby​​ 对象的 id)。

在另一个......你使用user.id但实际上并没有设置的值user变量(所以它总是会失败)。

也许尝试将相关的用户 ID 作为参数传递到方法中,例如:

# define the `user` parameter as an argument to this scope-method
scope :projects_for_user, -> (user){ joins(:user_id).where('project.profile.user_id = ?', user.id) }

def resolve
  if user.has_role?(:admin)
    scope.all
  elsif user.id == @project.profile.user_id
    scope.projects_for_user(user) # pass the user into the method
  elsif user.present?
    scope.in_state(:publish)
  else 
    Project.none  
  end
end

注意:我没有(也不会)测试这段代码,它可能有拼写错误或错误...尝试一下并修复错误。

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

Rails 4 - Pundit - 如何编写范围 的相关文章

  • 红宝石边缘情况

    ruby 有一些边缘情况很难解释 因为解析会带来一些有趣的问题 我在这里列出其中两个 如果您知道更多 请添加到列表中 def foo 5 end this one works if tmp foo puts tmp to s end How
  • “没有可用的二元红宝石”是什么意思?

    每当我使用rvm install x x x 即使安装成功 我也会收到此警告 No binary rubies available for osx 10 12 x86 64 ruby 2 4 0 Continuing with compil
  • 多态控制器和调用对象

    我的地址具有多态关系 可以由成员或依赖者拥有 一切看起来都很棒 直到我意识到除非我遗漏了一些东西 否则我不知道创建它的对象是什么类型 有没有办法告诉路由文件包含对象的类型 Models class Member lt ActiveRecor
  • 为什么 mongrel 没有在 Rails 3.2.rc 中启动?

    启动 mongrel 的 GEMFILE gem rails 3 1 0 gem mongrel gt 1 2 0 pre2 启动 WEBrick 的 GEMFILE 不是杂种 gem rails 3 2 0 rc2 gem mongrel
  • 使用 Fetch 和 FormData API 上传多个文件

    我正在尝试使用本机Fetch https developer mozilla org en US docs Web API Fetch API and FormData https developer mozilla org en US d
  • 在私有控制器方法中返回redirect_to

    前言 我正在使用设备进行身份验证 我试图阻止未经授权的用户查看 编辑或更新其他用户的信息 我最关心的是用户将 DOM 中的表单修改为另一个用户的 ID 填写表单 然后单击更新 我已经专门阅读过 像下面这样的东西应该有效 但事实并非如此 SO
  • Rails:CSRF 令牌不工作但已设置

    我在 Heroku 上有我的 Rails 3 应用程序 当我发送银行信息时 我得到 WARNING Can t verify CSRF token authenticity但我的 CSRF 令牌已设置 https gist github c
  • git push heroku master 权限被拒绝

    我正在关注 ruby railstutorial 我运行命令 git push heroku master 它吐出了这个错误 Permission denied publickey fatal Could not read from rem
  • 为什么“rails server -e production”会出现“没有路由匹配“/”并且样式表未加载?

    它正在运行 Rails 3 0 0 或 Rails 3 0 5 使用 Ruby 1 9 2 当处于开发模式时 rails server then http 本地主机 3000 http localhost 3000一切正常 并且http l
  • Rails Active Admin css 与 Twitter Bootstrap css 冲突

    我对 Rails 资产管道有点陌生 所以我可能做错了什么 我正在尝试为我的后端使用 Active Admin 为我的前端应用程序使用 twitter bootstrap css 我将 bootstrap css 添加到 应用程序 资产 样式
  • Watir 更改 Mozilla Firefox 首选项

    我正在使用 Watir 运行 Ruby 脚本来自动执行一些操作 我正在尝试自动将一些文件保存到某个目录 因此 在我的 Mozilla 设置中 我将默认下载目录设置为桌面并选择自动保存文件 然而 当我开始运行脚本时 这些更改并未反映出来 似乎
  • Rails 3 + angularjs + 缩小在生产中不起作用:未知提供者:eProvider

    我已遵循我能找到的所有修复缩小的说明 例如 var MyController function renamed scope renamedGreeter MyController inject scope greeter and someM
  • 目前最流行的 Ruby on Rails AUTHORIZATION gem/plugin 是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何从 Ruby 程序发送邮件?

    我想从 Ruby 应用程序发送电子邮件 核心语言中是否有调用来执行此操作 或者是否有我应该使用的库 最好的方法是什么 如果你不想使用行动邮递员 http wiki rubyonrails org rails pages ActionMail
  • Rails 4:资产未在生产中加载

    我正在尝试将我的应用程序投入生产 但图像和 CSS 资源路径不起作用 这是我目前正在做的事情 图像资源位于 app assets images image jpg 样式表位于 app assets stylesheets style css
  • Rails 控制台无法运行

    rbenv 红宝石版本 2 6 6 导轨版本 5 1 4 我正在较旧的代码库中工作 ruby 2 6 6 rails 5 4 1 这是我每天使用的代码库 我必须通过 rbenv 下载一个新的 ruby 版本作为单独的存储库 这样做在我的旧代
  • Rails/Nginx 中的超时——最佳实践

    我正在开发一个应该在 Nginx 服务器上运行的 Rails 应用程序 根据输入 应用程序可能需要很长时间来处理请求 或者在出现错误时挂起 因此我想防止进程永远运行 除了确保客户端收到超时信号的 Nginx 配置之外 我想我可能仍然需要确保
  • 使用 attr_accessor 动态创建类属性

    在Ruby中 有没有办法动态地将实例变量添加到类中 例如 class MyClass def initialize create attribute name end def create attribute name attr acces
  • REXML - 如何提取单个元素

    我正在用 ruby 编写一些验收测试 其中涉及断言响应 XML 中值的存在 我的 XML 是这样的
  • Rails - 渲染:目标锚标记的操作?

    我希望像这样使用渲染 render action gt page form 我也尝试过这个 render template gt site page form 那也没用 这个特定页面上的表单位于最底部 如果提交时发生任何错误 我不希望用户被

随机推荐

  • 我无法启用推送通知参数

    我三个月前创建了一个应用程序 并已成功批准进入 itunes 我需要做出的改进之一是包括 推送通知 问题是 当我尝试在developer apple com 的 App ID 中编辑该参数时 复选框被禁用 我无法检查它 这是他们告诉我们应该
  • 底部应用栏在使用片段导航时向上/向下滑动(导航架构组件)

    我正在查看底部应用程序栏 有一个很好的功能可以在滚动时隐藏它app hideOnScroll true 问题是我无法弄清楚当片段被删除时如何以编程方式向上或向下滑动它导航至和来自 例如 设置概述 开MainActivity具有导航主机片段
  • Fortran 中任何类型数组的过程

    Basis 我想编写一个过程 对任何输入数组类型进行一些操作 integer real 4 real 8 我在 StackOverflow 上读到的唯一想法是模仿 C 模板 使用通用过程进行覆盖 使用预处理器包含重复代码 但是搜索流行的I
  • 内存泄漏、访问已释放的内存和双重释放之间有什么区别?

    我试图找出与内存模型相关的这三种问题之间的区别 如果我想模拟一个memory leak场景中 我可以创建一个指针而不调用相应的删除方法 int main OK int p new int delete p Memory leak int q
  • 如何更改 conemu 中的字符集/区域设置?

    我通过 conemu 使用 gitbash 我有一个字符集问题 其中字符在 git bash 中通过 conemu 和直接 git bash 看起来错误 我通过将 minttyrc 中的区域设置设置为 在 gitbash 中修复了它 Bol
  • 何时使用嵌入式数据库

    我正在编写一个应用程序 它解析一个大文件 生成大量数据并用它进行一些复杂的可视化 由于所有这些数据无法保存在内存中 因此我做了一些研究 并开始考虑将嵌入式数据库作为这些数据的临时容器 我的问题是 这是解决这个问题的传统方法吗 嵌入式数据库
  • 命名约定:寻找混合英语和领域/工作流术语的替代方案

    尽管在我们公司 所有人的母语都不是英语 但我们还是努力用英语编写文档 代码和注释 当然 除了与用户相关的内容之外 几乎所有内容都是如此 只要业务术语是可翻译的并且不太特定于该领域 这就可以了 但是 一旦业务术语变得过于具体 要么没有适当的翻
  • Apache 重写子网 IP 范围

    有人可以告诉我如何将以下 IP 范围 属于 Cloudfront 放入 mod rewrite 中吗 我希望将 example com 的非 www 请求重定向到 www example com 但不重定向来自以下 IP 范围的任何 IP
  • 为什么我必须刷新页面才能使 JavaScript 函数正常工作?

    我正在开发一个移动网站并使用 jQuery 当我加载某个页面并单击所需的按钮时 代码在刷新页面之前不会执行 为什么是这样 我是这样的 script js document ready function user save click fun
  • CAShapeLayer 的中风结束没有动画

    这是我用来制作动画的代码CAShapeLayer progressBarLayer strokeEnd CGFloat progressToDrawForProgress progress let progressAnimation CAB
  • 将 git 存储库复制到 USB 驱动器

    我正在开发一个开源项目 我的机器上有一个包含所有代码的 git 存储库 该存储库有点大 我想在无法访问我的计算机时继续处理它 如果我将存储库复制到我的 USB 驱动器中 它的行为是否仍然像我在计算机中的原始存储库上一样 相同的配置等 如果复
  • 如何在 where 子句中使用 row_number

    我正在尝试使用窗口函数来获取最近的 n 条记录 如下从这里 https stackoverflow com questions 61570170 something like select distinct on but for n 1 6
  • 如何在 Fortran 中重写结构体构造函数

    目前是否可以重写 Fortran 中的结构构造函数 我见过这样的建议示例 例如在 Fortran 2003 规范中 module mymod type mytype integer x Other stuff end type interf
  • WPF 应用程序可以进行依赖注入吗?

    我想开始在我的 WPF 应用程序中使用依赖注入 主要是为了更好的单元可测试性 我的应用程序主要是按照 M V VM 模式构建的 我正在看Autofac https code google com p autofac 对于我的 IoC 容器
  • Firebase 推送通知点击不起作用

    我在使用 firebase 实现通知时遇到问题 点击事件不起作用 我正在使用 HTTP 1 版本发送不记名令牌 message token 8888 usertoken 8888 notification title Background
  • OpenCV 如何计算二进制对象的面积? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在使用 OpenCV 和 c 二值化后我有黑白图像 当我只有一个点 x y 属于该对象时 如何计算对象的面积 由于它是二值图像 因
  • 只保留使用过的类型并删除未使用的类型

    有什么方法可以从项目中删除未使用的类型 代码 假设我正在使用NAudio 源代码 在我的控制台应用程序中 我只使用WaveIn从中类 有什么方法可以让我从代码中删除未使用的类并只保留WaveIn班级和班级WaveIn取决于 沿着树摇晃的方向
  • verifyError:错误#1079:加载的代码中不允许使用本机方法

    我有一个用 AS3 编译的 Android iOS 应用程序 我遇到了问题 建议升级到 Flash Builder 4 7 从 4 6 开始 我这样做了 当我尝试使用新的 Air 3 4 运行时 出现以下错误 VerifyError Err
  • Pydev 代码覆盖结果不出现

    我已经设置了代码覆盖率以与 pydev 一起运行 但结果没有出现 下列的这个答案 https stackoverflow com questions 297294 integrating command line generated pyt
  • Rails 4 - Pundit - 如何编写范围

    我正在尝试学习如何将 Pundit 与 Rails 4 结合使用 过去 2 年我一直在尝试学习这一点 并且正在慢慢取得一点点进展 我也在尝试学习如何编写范围 我仍在尝试找出如何将建议翻译成简单的英语 以便我可以开始理解 我陷入了专家策略使用