【问题标题】:"uninitialized constant" routing error using Clearance使用 Clearance 的“未初始化常量”路由错误
【发布时间】:2025-12-22 03:55:07
【问题描述】:

我正在使用 Clearance 进行身份验证,并尝试根据用户是否登录来设置 root。登录、注销和创建/删除用户都可以正常工作。

我正在关注这个article from Thoughtbot,我在其中为我的路线添加了一个约束。

# Logged in user
root to: "dashboard#index", constraints: Clearance::SignedInConstraint`

# Visitor
root to: "home#index"

我还在 /lib/clearance 中创建了 signed_in_constraint.rb 来执行检查:

module Clearance
  class SignedInConstraint
    def self.matches?(request)
      request.env[:clearance].signed_in?
    end
  end
end

如果我打开 rails 控制台并检查 Clearance,我没有收到任何错误,因此它正在加载 Clearance 模块,而不是从 lib 加载 SignedInConstraint。

rails console
Loading development environment (Rails 4.0.0)    
irb(main):001:0> Clearance
=> Clearance
irb(main):002:0> Clearance::SignedInConstraint
NameError: uninitialized constant Clearance::SignedInConstraint

我还按照 Github repo 上的this ticket 多次重启了我的服务器(运行 Anvil 和 PostgresApp)。

在 Ruby 2.0 上使用 Rails 4。

谢谢

【问题讨论】:

    标签: ruby-on-rails ruby authentication ruby-on-rails-4 clearance


    【解决方案1】:

    现在 Clearance 中内置了约束。您可以执行以下操作:

    constraints Clearance::Constraints::SignedIn.new { |user| user.admin? } do
      root to: 'admin'
    end
    
    constraints Clearance::Constraints::SignedIn.new do
      root to: 'dashboard'
    end
    
    constraints Clearance::Constraints::SignedOut.new do
      root to: 'marketing'
    end
    

    祝你好运!

    【讨论】:

    • 谢谢 Dan - 我确实在文档中看到了这一点,但我得到了 ArgumentError: Invalid route name, already in use: 'root'。是否需要任何额外的逻辑?
    • 看来这个(没有重复的名称)是特意内置到 Rails 4 中的。我现在使用 ':as' 命名了路由并且它工作正常。谢谢你的帮助。 Source