【问题标题】:Ruby on Rails: Common method available for controllers and views?Ruby on Rails:可用于控制器和视图的常用方法?
【发布时间】:2014-07-28 03:02:03
【问题描述】:

我使用 Ruby on Rails 已经有一段时间了。最近我为我的应用程序实现了一个身份验证系统。我在“application_helper.rb”上提供了一个方法来检索当前登录的用户(称为 current_user 的方法)。

如果存在session[:user_id] 变量,该方法只会检索我的User 对象。

但是我面临以下问题。

  1. 如果我将 current_user 方法放在“application_helper.rb”中,我的控制器就无法使用它
  2. 如果我将current_user 方法放在'application_controller.rb' 中,我的views 将无法使用它

解决此问题的最佳方法是什么?简单的方法是在控制器和助手中复制我的代码,但我知道有更好、更正确的方法。

提前致谢

【问题讨论】:

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


    【解决方案1】:

    这是一个常见且很好解决的问题。

    Rails 不允许控制器访问辅助方法。如果你想在你的视图和控制器之间共享一个方法,你需要在你的控制器中定义该方法,然后通过helper_method 使其对你的视图可用:

    class ApplicationController < ActionController::Bbase
    
      # Let views access current_user
      helper_method :current_user
    
      def current_user
        # ...
      end
    
    end
    

    您可以将多个方法名称传递给helper_method,以使您的控制器中的其他方法可用于您的视图:

      helper_method :current_user, :logged_in?
    
      def current_user
        # ...
      end
    
      def logged_in?
        !current_user.nil?
      end
    

    【讨论】:

    • 我知道事情就是这么简单。我认为 helper_method 与将方法放入辅助类中的作用相同,但事实并非如此。感谢您的快速回答和语法编辑。 :)
    • @meagar:我有同样的问题,但是添加辅助方法并没有解决它,我已经在我的 class_controller 而不是应用程序控制器中定义了我的方法和我的辅助方法。 stackoverflow.com/questions/24993912/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    相关资源
    最近更新 更多