如何将 Rails 操作或控制器名称拉入我的 Ruby Gem 以便在日志文件中使用?

How can I pull in the Rails action or controller names into my Ruby Gem for use in a log file?

这里的第一个问题请放轻松。我正在编写 gem 用于我的 rails 应用程序。 gem 将简单地将控制器中的操作通过参数传递的信息打印到日志文件。我一直在努力,直到我希望报告文件也打印信息来源的操作名称。所以示例输出将是:

记录的详细信息:日期和时间 动作报告:(控制器+动作名称)Profile.update 然后是参数信息。我正在努力使用下面的代码提取参数信息。

我已经注释掉了我认为会为我带来数据的部分。得到一个错误。任何建议将不胜感激。谢谢。

# initializes file and writes-only at end of file if exists or creates new one
def self.open(filename)
    @filename = File.open(filename,'a+')
end


# method to take in any amount of parameters and write to file
def self.usageLog (*items)
    ReportLogger.open("UsageLogging.txt")
    # string actionName = controllerContext.RouteData.values["action"].ToString()
    @filename.print("Logged Details: " + Time.now.strftime("%d/%m/%Y %H:%M:%S") + "\n")
    # @filename.print("Report Action: :" + actionName)
        items.each do |item|
            @filename.print(item)
        end

        @filename.puts( " -EndLog" + "\n" + " - - - - - - - - - - - - - - ")
    end 

已修改 - 我试过这个但似乎无法正常工作。我已经将控制器更改为调用 ReportLogger.usageLog(profile_params) 所以这应该引入所有参数?我已经像下面那样修改了 Gem 代码,但它似乎不想将控制器详细信息提取到日志中。

# method to take in any amount of parameters and write to file
def self.usageLog(params)
    ReportLogger.open("UsageLogging.txt")
    # string actionName = controllerContext.RouteData.values["action"].ToString()
    #controller_name = params["controller"]
    #action_name = params["action"]
    #other_params = params.reject do |k,v| 
    #   %w(action controller).include? k
    #end

    @filename.print("Logged Details: " + Time.now.strftime("%d/%m/%Y %H:%M:%S") + "\n")
    #@filename.puts(controller_name)

    #@filename.print("Report Action: :" + controller_name)

    controller_name = params[:controller]
    @filename.puts(controller_name)

    params.each do |param|
        @filename.print(param.to_s + "\n")
    end

        @filename.puts( " -EndLog" + "\n" + " - - - - - - - - - - - - - - ")
    end

报告日志如下所示:

记录的详细信息:2015 年 2 月 12 日 13:11:11

["name", "Bradley"] ["phone_number", "087 6312683"] ["image", #, @original_filename="IMG_0001.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"profile[image]\";文件名=\"IMG_0001.jpg\"\r\nContent-Type: image/jpeg\r\n">] ["bio", "New feck, shit!"] -结束日志


参数始终包含控制器名称和操作名称:

def index
  puts params
end
> {"controller"=>"home", "action"=>"index"}

所以如果你让你的 usageLog 方法接受整个参数哈希,你可以只访问这些,比如:

def self.usageLog(params)

  controller_name = params["controller"]
  action_name = params["action"]
  other_params = params.reject{|k,v| %w(action controller).include? k }

end

然后你想从控制器登录的地方,只要做:

ReportLogger.usageLog(params)

或者如果你想传入多个参数,你可以这样调用:

ReportLogger.usageLog(params[:controller], params[:action], model_params, "anything else")

其中 model_params 是您正在处理的模型的净化白名单方法。

然后你可以这样定义你的方法:

def self.usageLog(controller_name, action_name, *items)
  ....
  items.each do |item|
    @filename.print(item.to_s + "\n")
  end

end