【问题标题】:How do I invoke a method from my helper module in my config/routes.rb file?如何从我的 config/routes.rb 文件中的辅助模块调用方法?
【发布时间】:2017-05-01 13:05:54
【问题描述】:

我正在使用 Rails 5。如何让我的 confnig/routes.rb 文件识别我在帮助模块中定义的函数?在我的 app/helpers/sessions_helper.rb 文件中,我有

  # Returns true if the user is logged in, false otherwise.
  def logged_in?
    !current_user.nil?
  end

然后在我的 config/routes.rb 文件中

 get '/', to: 'users#show',  constraints: lambda { |request| SessionsHelper.logged_in? }

但是在加载我的应用程序时,我收到了错误

undefined method `logged_in?' for SessionsHelper:Module

从我的模块调用辅助方法的正确方法是什么?

【问题讨论】:

    标签: ruby-on-rails routes config ruby-on-rails-5 helper


    【解决方案1】:

    您使用设计吗?如果是,那么你应该这样做:

    authenticated 
      get '/', to: 'users#show'
    end
    

    更多详情参见 Devise 代码:https://github.com/plataformatec/devise/blob/master/lib/devise/rails/routes.rb#L294

    【讨论】:

    • 为什么每个人都一直问我是否使用设计?不,我没有。
    • 因为 Devise 是最流行的用于身份验证的 Rails gem。无论如何,您可以查看设计的代码并了解他们插入了守望者机架中间件以获取有关身份验证状态的信息。您应该使用@meagar 建议。
    【解决方案2】:

    你不能这样做,也不应该这样做。您的路由文件不包含存储当前用户授权的会话的概念,该会话由您的控制器选择路由并实例化正确的控制器后提供。无论如何,授权不属于您的路由文件中的约束。

    如果您的 current_user 未设置为预期值,您的控制器应负责呈现 422“未经授权”。在before_action 回调中执行此操作。

    class UsersController < ApplicationController
    
      before_action :require_login
    
      # ...
    
      protected
    
      def require_login
        redirect_to login_path unless current_user
      end
    end
    

    您通常会将require_login 功能和before_action 回调放在ApplicationController 中,然后选择性地将不需要使用skip_before_action 进行身份验证的控制器列入白名单。许多 gem 已经提供了这种精确的设置,并具有大量的额外功能。例如,请参阅Devise

    【讨论】:

    • 我的目标是,如果用户登录,当有人访问root时,他们将被重定向到用户主页。通过阅读您的答案,我不清楚我将如何实现这一目标。
    • @Natalia 和我写的完全一样,before_actionredirect_to 在正确的控制器中,无论哪个处理你的 root 操作
    • 我没有为根 url 设置任何控制器,所以要默认应用程序控制器吗?即便如此,通过把这个“before_action :require_login”放在我的那个控制器中的每一个动作上,对,但这不是我想要的。如果他们已登录,我只想从根路径(“/”)重定向。在其他情况下,我不需要这样的重定向。
    • 然后将重定向放在方法中,或者使用before_action :redirect, only: :index,或者只是通过render 'users/show'从动作中渲染正确的视图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 2011-03-27
    • 2011-02-23
    相关资源
    最近更新 更多