Rails:如何访问 lib 文件夹类中的“请求”?

Posted

技术标签:

【中文标题】Rails:如何访问 lib 文件夹类中的“请求”?【英文标题】:Rails: How can I access "request" within lib folder class? 【发布时间】:2018-06-04 15:12:47 【问题描述】:

我正在尝试通过 Faye Websocket 实现 websocket。

到目前为止,我已经能够在后端和客户端JS上实现websocket中间件来打开websocket并在双方发送和接收数据..

现在在 Rails 后端,我正在处理通过 lib 文件夹中的自定义类接收到的 websocket 消息。我想通过lib文件夹中myClass中的“request.remote_ip”获取客户端IP地址(计划在解决获取IP地址时添加user_agent信息),不幸的是无法直接访问它。

您能否指导我如何访问 lib 文件夹中的“请求”对象?

lib/myClass.rb

class myClass
  ip_address = request.remote_ip


end

#<NameError: undefined local variable or method `request' for #<myClass:0x0055c6fb18d860>
Did you mean?  require>

【问题讨论】:

request从控制器作为参数传递给库 我没有从控制器调用自定义类方法。我正在尝试使用 websocket .. myClass 正在处理通过 websocket 接收到的消息。我也不喜欢在可能被操纵的 websocket 中发送客户端 IP 能否添加更多上下文,例如调用类的位置以及触发调用的时间? 我有 Faye::Websocket 中间件,它正在监听 websocket 连接。在中间件代码中,我使用套接字消息作为参数调用 myClass 【参考方案1】:

这样使用:-

lib/my_class.rb

class MyClass < Struct.new(:request)
  def self.call(request)
    new(request).call
  end

  def call
    ip_address = request.remote_ip
  end
end

来自some_controller:-

class SomeController < ApplicationController
  def some_method
    MyClass.call(request)
  end
end

【讨论】:

因为我不是从 ApplicationController 调用它是不可能的【参考方案2】:

我发现,Faye Websocket 对象还存储环境变量,其中包括我正在寻找的客户端 IP 地址和用户代理信息。

  user_agent: socket.env["HTTP_USER_AGENT"],
  ip_address: socket.env["REMOTE_ADDR"]

所以我直接从 Faye websocket 对象获取这些信息,而不是请求对象。

【讨论】:

以上是关于Rails:如何访问 lib 文件夹类中的“请求”?的主要内容,如果未能解决你的问题,请参考以下文章

应该如何访问 /lib 中的查看辅助方法?

Ruby on Rails 3 - 为每个请求重新加载 lib 目录

从 Rails 3 中的 lib 文件夹加载模块/类的最佳方法?

如何将lib中的控制器方法与Rails一起使用?

如何将导入的gem中的vue组件加载到rails中的lib目录?

如何在 ruby​​ on rails 中访问 rails 助手和嵌入资产 javascript 文件中的 ruby​​?