【问题标题】:Rails - helper method in controller available in the model?Rails - 模型中可用的控制器中的辅助方法?
【发布时间】:2015-08-14 15:25:24
【问题描述】:

application_controller中有一个辅助方法:

  def current_user
      @current_user ||= User.find(session[:user_id])
      return @current_user
  end

我想在模型中设置before_save 回调 - 以便在更新活动记录时保存current_user.id

基本上,每当模型被更改或修改并保存时,我想确保为该模型填充 updated_by 列/

但不知道如何访问模型中的当前用户?

谁能给点建议?

【问题讨论】:

  • application_controller 中的辅助方法是什么意思?
  • 在 application_controller 的顶部有这一行:helper_method :current_user
  • 我的感觉是多一点代码会有帮助。具体来说,正在调用的 Controller 的操作。模型是before_save
  • 我还没有生成 before_save。我只想能够从任何模型中确定当前用户。我发布的方法似乎可以做到这一点
  • 你不能(好吧,不应该)访问模型中的辅助方法......但是,如果我们可以看到模型(它具有什么属性等)和控制器的操作,所以用户可能会帮助您找到以“Railsy”方式完成所需任务的最佳方式!

标签: ruby-on-rails


【解决方案1】:

你可以这样做来从模型访问控制器中声明的实例变量

class User < ActiveRecord::Base
  cattr_accessor :current_user
end 

 class ApplicationController < ActionController::Base
      before_filter :current_user

      def current_user
        @current_user ||= User.find(session[:user_id])
        User.current_user = @current_user
    end
  end
end

【讨论】:

    【解决方案2】:

    不可能,current_user 仅在控制器中可用。您应该在方法中传递 current_user id,例如:

    在控制器方法中:

    def action
      method_with_user_id(current_user.id)
    end
    

    在模型类定义中:

    def method_with_user_id(user_id)
      #things with the user id
    end
    

    【讨论】:

    • 谢谢我目前正在这样做,但我想创建一个 before_save 回调,以便更新后的用户都将针对该模型进行更新,而我不必在任何地方调用方法
    • 什么意思是“以便更新的用户都将获得该模型的更新”?
    【解决方案3】:

    Helpers 方法不适用于模型,仅适用于视图。

    我认为不是在模型中设置before_save 并传递 current_user.id 我认为你的模型和用户之间存在关系,所以你应该建立关系,并在创建中传递用户对象该模型的作用。

    在你的应用程序控制器中你应该有这样的东西。

    class ApplicationController < ActionController::Base
      protect_from_forgery with: :exception
      def current_user
          @current_user ||= User.find(session[:user_id])
          return @current_user
      end
    end
    

    并且在您的模型控制器中,您可以访问该方法。

    def create
      current_user.my_model.create(params_model)
    end
    

    【讨论】:

      【解决方案4】:

      作为一种设计选择,不建议从模型中调用控制器助手。模型不应该知道它的控制器。这不是 Railsy 做事的方式。

      要获得解决方法,您可以在控制器的类属性中设置实例变量@current_user

      class ApplicationController < ActionController::Base
        before_filter :set_current_user
        def set_current_user
          @current_user ||= User.find(session[:user_id])
          Account.current_user = @current_user
        end
      end
      

      然后,在您的模型中:

      class User < ActiveRecord::Base
        cattr_accessor :current_user
      end
      

      然后只需在您的模型中使用Account.current_user 访问@current_user

      【讨论】:

        猜你喜欢
        • 2011-07-28
        • 2023-03-03
        • 2013-12-22
        • 2010-12-10
        • 1970-01-01
        • 2012-02-13
        • 1970-01-01
        • 2011-02-05
        • 1970-01-01
        相关资源
        最近更新 更多