如何在Rails中获取模型中的request.uri?

Sre*_*raj 18 ruby ruby-on-rails ruby-on-rails-3

$request = request
Run Code Online (Sandbox Code Playgroud)

当我在控制器中写这个时,它会工作.但如果我需要在模型或应用程序控制器中使用此变量,我该怎么办?

DGM*_*DGM 15

模型存在于Web请求的上下文之外.您可以在irb中实例化它们,您可以在延迟的作业或脚本等中实例化它们.如果模型依赖于请求对象,则这些都不可能.

正如tsdbrown所说,你必须以某种方式从使用该模型的上下文中传递该信息.


Sre*_*raj 13

我知道了

class ApplicationController < ActionController::Base
  protect_from_forgery

  before_filter :beforeFilter

  def beforeFilter
     $request = request
  end  
end
Run Code Online (Sandbox Code Playgroud)

现在我们可以在代码中的任何地方使用$ request全局变量

  • 虽然这有效但并不精彩.全局变量很危险.最好遵循此线程中的其他建议,并让控制器将有关当前请求的信息直接传递给其他级别. (15认同)
  • 绝对是Thread [:current]之一.Rails很可能每个请求都执行多个线程,尤其是在没有GIL的j-ruby环境中. (4认同)

tsd*_*own 7

您无权访问模型中的请求对象,您必须传递request.request_uri.

也许通过自定义方法.例如@object.custom_method_call(params, request.request_uri)

另一种选择是attr_accessor :request_uri在模型中添加一个并在其中设置/传递:

@object.update_attributes(params.merge(:request_uri => request.request_uri))
Run Code Online (Sandbox Code Playgroud)


小智 5

如果你使用rails > 5.0,你可以执行以下操作

在模型/关注点中添加模块

module Current
  thread_mattr_accessor :actor
end
Run Code Online (Sandbox Code Playgroud)

在 application_controller 中做

around_action :set_thread_current_actor

  private

  def set_thread_current_actor
    Current.actor = current_user
    yield
  ensure
    # to address the thread variable leak issues in Puma/Thin webserver
    Current.actor = nil
  end
Run Code Online (Sandbox Code Playgroud)

然后在线程中的任何地方获取 current_user

Current.actor
Run Code Online (Sandbox Code Playgroud)