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 文件夹类中的“请求”?的主要内容,如果未能解决你的问题,请参考以下文章
Ruby on Rails 3 - 为每个请求重新加载 lib 目录
从 Rails 3 中的 lib 文件夹加载模块/类的最佳方法?
如何将导入的gem中的vue组件加载到rails中的lib目录?
如何在 ruby on rails 中访问 rails 助手和嵌入资产 javascript 文件中的 ruby?