Request.env variables in an observer


#1

I have a scenario were I would like to inject the IP address and
UserAgent into an email when a database record is saved. I was
thinking of implementing this via an observer but I don’t know how to
access the environment variables. Could anybody help or would this
break Rails best practices and I should implement this differently.

Thanks.


#2

I have a scenario were I would like to inject the IP address and
UserAgent into an email when a database record is saved.

You need to trap the remote_ip and user_agent from the request method
in the Controller instance for that request. That is where this
information is received. Then you need to have this information
available in the Active Record instance where the save is happening.

One way to do this is to use the Thread class since both operations
are ocurring on the same thread. There is a Thread.current object that
you can stuff the info you need.

In your application.rb controller file:

class ApplicationController < ActionController::Base
before_filter :log_ips

private

def log_ips
Thread.current[‘remote_ip’] = request.remote_ip
Thread.current[‘user_agent’] = request.user_agent
end

end

Then somewhere your rails load path, either in lib or your models
directory, add an active record extension.

module ArExtension
def self.included(m)
m.class_eval do
after_save :log_ips
end
end

def log_ips
puts Thread.current[‘user_agent’] # do you really want to email
every request? you might want to do something else
puts Thread.current[‘remote_ip’]
end

end

ActiveRecord::Base.class_eval do
include ArExtension
end

Hope that helps.