【问题标题】:Where to put constraint classes in Rails project在 Rails 项目中放置约束类的位置
【发布时间】:2012-10-23 18:53:38
【问题描述】:

只是对 Rails 的最佳实践感到好奇,我在哪里放置了一个自定义约束类,该类用作 config/routes.rb 中的约束。似乎Rails.root/lib 是所有用户类的去处。这适合这个吗?我应该在里面为约束创建一个目录吗?现在存在 2 个空目录,assetstasks。有这方面的约定吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 naming-conventions ruby-on-rails-3.2 convention-over-configur


    【解决方案1】:

    lib/ 将是合适的位置。如果你想让它更干净,把它放在lib/constraint/authenticated.rb 并像这样定义你的约束

    module Constraint
      class Authenticated
        def matches?(request)
          # stuff
        end
      end
    end
    

    在你的routes.rb

    constraints Constraint::Authenticated.new do
      match 'account' => 'account#index'
    end
    

    【讨论】:

    • 不知道你可以这样指定约束。在 Rails 指南中没有看到,guides.rubyonrails.org/routing.html
    • 我的设置基本相同 - 除了我收到 NameError: uninitialized constant Constraint 错误。当我删除模块并仅引用MyConstraint.new(没有命名空间)时,它就可以工作了。为什么将其包装在模块中会引发这样的错误?我真的很想要那个命名空间>
    【解决方案2】:

    奇怪的是,该指南没有说明该路径,但 lib/constraints 甚至列在 API (ActionDispatch::Routing::Mapper::Scoping) 中:

    如果路由过于复杂,您可以将此逻辑移出到一个类中。这个类必须定义一个 matches? 方法,如果用户应该有权访问该路由,则返回 true,否则返回 false。

    class Iphone
      def self.matches?(request)
        request.env["HTTP_USER_AGENT"] =~ /iPhone/
      end
    end
    

    此代码的预期位置是 lib/constraints

    【讨论】:

    • 虽然 API 建议 lib/constraints,但我认为 app/constraints 是更合适的位置,因为后者是自动加载的,而前者不是。不过,这只是我的实践。
    • 它是否在开发中自动加载无关紧要。我根据该特定类是否特定于域来做出决定,遵循这篇博文:blog.codeclimate.com/blog/2012/02/07/…
    猜你喜欢
    • 2015-05-14
    • 2016-12-06
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多