intercom / intercom-rails Goto Github PK
View Code? Open in Web Editor NEWThe easiest way to install Intercom in a Rails app.
Home Page: https://developers.intercom.io/reference
License: MIT License
The easiest way to install Intercom in a Rails app.
Home Page: https://developers.intercom.io/reference
License: MIT License
There is no git release tag for the latest version 0.2.28
I see on the ruby intercom project that it is possible to push an user event (intercom/intercom-ruby#69) wondering if this is possible on the rails gem too? or If thats something we need to add-on ?
thanks
Hello. We had a problem importing users using the rake task. This seems to be a problem when secure mode is on. It worked perfectly before we enabled that on our Intercom account.
When secure mode is enabled on the account the rake task fails with:
IntercomRails::IntercomAPIError: The Intercom API request failed with the code: 500, after 3 attempts.
We had a suspicion that the import task needed the user_hash to be calculated and sent with the request. See this commit on our fork.
This worked, but I didn't do a pull request as I suspect the correct fix is to allow import without the user_hash as the user_hash is for protecting against forgery in the browser. Where as the import script is run on the server.
If you disagree I'm happy to clean up our fork of course. The code to calculate the user_hash shouldn't be duplicated and I'd be happy to clean that up.
Thanks,
Greg
rake intercom:import
test on hex
then use on prod
Hi all, this is more of a question rather than an issue. We are working on integrating Intercom in our app to track all our events and page views, and we initially thought of putting them all in a AnalyticsObserver.rb.
However, as of Rails 4, observers are highly discouraged and we're trying to find what's the best way to track users and send events without cluttering our code.
Any ideas / suggestions?
When I use Turbolinks.visist() directly in my Javascript, I see the Intercom code inserted in the HTML after the page change, but the inbox never show up. Any hints?
I have several types of user accessing my app: Teacher
, Student
, Parent
, etc. I want to observe all types but only show the messenger inbox to Teacher
types.
Is there a way to achieve this without having to code a custom intercom_script_tag
?
I hoped there might be a config option for it, something like:
config.show_inbox = Proc.new { |user| user.type == 'Teacher' ? true : false }
I tried passing a similar Proc into config.inbox.style
to switch to custom style (ie hide the icon) but it didn't work.
I'd like to be able to cache the company name of the current user without loading my company model. However I am not sure how to do that since it appears that the company name is determined by running company.name
after loading the company from config.company.current = Proc.new { current_user.company }
.
I'd rather not cache the entire company model because the cache invalidation could be tricky, but caching the name (especially if it was just for intercom) would be fine. Am I missing something simple?
Hello,
I'm using intercom-rails (0.2.27), when I try to import using rake test, getting this error below; doubled checked api key it is all correctly set on initializer. Can you re-produce this?
IntercomRails::IntercomAPIError: The Intercom API request failed with the code: 401, after 3 attempts.
If I were manually inserting the Javascript, I'd do this to add a "real name" for the current user:
var intercomSettings = {
name: 'John Doe' // Optional: Replace with real name if available
};
But I don't see a way to do this with the gem. Am I missing something obvious? Or do I just pass it as custom data?
The README doesn't talk at all about setting up companies. This needs to be updated. The stock intercom.rb initializer file does give some basic instructions so the instructions could likely be copied over without much change.
Further to issues 5 and 20, skipping the auto include filter appears to be broken again. Neither of these snippets work:
skip_after_filter IntercomRails::AutoIncludeFilter
skip_after_filter :intercom_rails_auto_include
Hi, I run a multitenant app with 2 tenants. I want to configure Intercom to send data to 2 Intercom app_ids based on the subdomain of the current page load. Current, config/initializers/intercom.rb doesn't allow me to do this because config.app_id, config.api_secret, and config.api_key are set upon server startup, not upon page load. I was looking at https://github.com/intercom/intercom-rails/blob/master/lib/intercom-rails/config.rb#L22 to figure out if I could pass a Proc or a block to IntercomRails, but it doesn't look like I can.
Is there a way to set my Intercom credentials dynamically (i.e. similar to how current user gets set with a Proc), without just abandoning all the Rail-y config this app provides and going straight Javascript/helper?
Thanks.
-Ben
The gem seems to automatically include the Intercom JavaScript, even if it has not been explicitly added to the file. We have one layout which we do not want Intercom on, but it is still inserting the JS.
It appears there is no way to disable this behaviour. In our case, this layout will never be used by users we want to track, and it adds a substantial load time to the page. There needs to be a way to exclude it explicitly from certain layouts.
Hey there,
Gotta start by saying I love Intercom and that it's got an incredible developer onboarding process. Unfortunately, I've hit a snag with getting companies set up.
To start, we use devise so our intercom user config works with the default current_user
and required no work. We also have a Company
model and User
's have one company. Ie. If you were to execute current_user.company
in the controller, you would get an instance of of the class Company
.
Here's where the trouble arises. I have attempted the two suggested solutions in the Intercom initializer for adding a company to Intercom.
First, I uncommented:
# config/initializers/intercom.rb
config.user.company_association = Proc.new { |user| [user.company] }
I presumed this would execute something like this at some point:
IntercomRails.config.user.company_association.call(current_user)
And it would return current_user
's company in an array. When I do this from the console, it does return just that. It does not do this in the app though. I've also attempted to replace the Proc
with just returning any instance of Company
by doing:
# config/initializers/intercom.rb
config.user.company_association = Proc.new { |user| [Company.first] }
This did not work either, so I moved onto the other option of current_company
by uncommenting:
# config/initializers/intercom.rb
config.company.current = Proc.new { current_company }
I also defined the following helper:
# app/helpers/application_helper.rb
module ApplicationHelper
...
def current_company
if current_user
current_user.company
end
end
...
end
This didn't work though so I checked if I can just provide a random Company
object and just return something. I then update the initializer to:
# config/initializers/intercom.rb
config.company.current = Proc.new { Company.first }
This did work and I managed to get a company on Intercom.io. From here, I've tried to work together some sort of solution but I have not been able dynamically produce a company for my users. As I mentioned before, I expected the following to be executed somewhere:
IntercomRails.config.user.company_association.call(current_user)
I started to look through the source code here and in https://github.com/intercom/intercom-ruby and the I believe the Proc
is called here:
# intercom-rails/lib/intercom-rails/proxy/company.rb
def self.companies_for_user(user)
return unless config(:user).company_association.present?
companies = config(:user).company_association.call(user.user)
return unless companies.kind_of?(Array)
companies.map { |company| new(company) }.select { |company_proxy| company_proxy.valid? }
end
Though, I think this is only called in the importing script, I don't understand what user.user
does. Any help would be appreciated. Please let me know if I can provide any further information.
Hi guys,
Are the ones described here available to this gem?
http://doc.intercom.io/api/v1/
I know it's possible to curl it but wondering if you guys already have something built-in. If so, can you guys send me a link of docu. If not, any plans to integrate?
As mentioned in #5, you should be able to skip the after filter like this:
skip_after_filter IntercomRails::AutoIncludeFilter
This doesn't work. Under Rails 3.2.9 and IntercomRails 0.2.8, the filter is still executed even with that line in ApplicationController
. It seems the problem is with the way ActiveSupport handles the callbacks internally. ActiveSupport::Callbacks::Callback#matches?
checks for:
@kind == _kind && @filter == _filter
But the value of @filter
for the AutoIncludeFilter
callback is being set to a value like "_callback_after_3"
, and not AutoIncludeFilter
, so the match fails as it's effectively comparing:
"_callback_after_3" == IntercomRails::AutoIncludeFilter
This call to matches?
happens on lib/active_support/callbacks.rb:519
.
Is it possible to exclude some types of users from being imported to Intercom.io?
The first simple solution I found was to skip the controller filter, but when I ran the import rake task all of my users are imported into Intercom.io.
I think an useful feature would be having an option in the config file to include/exclude certain types of users, with a Proc.
Hi,
We are trying to import our current users into intercom, but we're having a bit of an issue with the config file. From looking at the code, we don't quite understand how we can import elements such as last_seen_ip, last_seen_user_agent, updated_at, last_request_at, and number of previous logins (sessions).
Should those be passed as custom_data?
I have custom data that returns a Date object. It works fine for users who log in to the system and have their intercom data sent along that way.
It doesn't work for importing old users.
Here's a user I inspected via the console:
1.8.7 :025 > u = User::Employer.find_by_email("[email protected]")
=> #<User::Employer ... >
1.8.7 :026 > proxy = IntercomRails::Proxy::User.new(u)
=> #<IntercomRails::Proxy::User:0xe4cbfb8 ...>
1.8.7 :027 > proxy.custom_data[:listing_last_published]
=> Wed, 09 Dec 2009
1.8.7 :028 > proxy.custom_data[:listing_last_published].class
=> Date
After I run the import script, the user's listing_last_published
shows up as 1 Jan 1970
.
If I spoof the user to simulate them logging in, the listing_last_published
field updates to the correct value.
How to disable intercom button on some pages? For example in activeadmin
Hi guys,
Just started using this gem and am wondering what the best approach for this is:
We have an admin feature in our app where you can 'become' a user and see the site through their eyes. When we do this, we set a session variable to show that the current user is actually a superuser.
Ideally, I'd like to keep session value checks out of my model, i.e.
#config/initializers/intercom.io
...
config.user.exclude_if = proc { |u| u.imposter? }
...
#app/models/user.rb
def imposter?
session.key?(:masquerade)
end
feels a bit icky.
I'm not sure if checking the session variable directly in the proc is any nicer either.
Is this the only way to do it?
Thanks!
W
Previously, this
= intercom_script_tag nil, widget: { activator: '.intercom' }
used to work, without any changes from intercom website, and overrode any custom settings done to make the class .intercom
act as activator and also not show the intercom messaging icon.
With the new messaging App, the icon still shows even after having a custom activator, unless disabling from here http://take.ms/x29NX
On a current project we have 3 different User models (2 that are important for Intercom). One for Venues and one for QuizMasters. Both respond to the current_user method so at first glance it seems to work, but I'm wondering if there will be an issue since the user_id
will overlap since they are different models and the ids would not be unique between models.
Eg I'm sure there is a 'user' in both models with the id of 42.
What can I do for make intercom aware of this? Or do I need to?
Thanks!
I am using the intercom-rails gem and went to look at the specific readme and code for the version we are currently using (per our Gemfile.lock) and noticed that there is no tag for 0.2.24.
In our app, we are using turbolinks and intercom-rails. We do not want the Intercom interface to show up for views under LessonsController, so we include the line skip_after_filter :intercom_rails_auto_include
in that controller.
When we visit a page in LessonsController directly, the Intercom include is not served to the client (as expected).
However, if the client starts in a view under DashboardController (which does include Intercom), then clicks a link to a view in LessonsController, the Intercom interface is still shown because turbolinks does not remove the Intercom include.
I am aware that there are many ways to interact with the Intercom API with both the javascript client and the intercom ruby gem. Is there a preferred technique for updating a users details with async/ajax events? Preferably I would like to be able to push these events via javascript without having to add an extra remote javascript dependency.
FWIW. It seems like my best path would be to go to the javascript and not require the niceties of the intercom-rails gem. Can you confirm?
I want to use the Intercom script to monitor user activity, but I want to hide the Intercom Messenger displayed in the page. Is there a configuration for it in the gem?
It looks like intercom-rails won't run on ruby 1.8 - http://stackoverflow.com/questions/14791087/cannot-install-intercom-io-gem-ubuntu-12-04-lts
It should be straightforward to fix that
Hello,
I'd like to use another method than current_user.id
to send to intercom.
I have defined a method intercom_id
which I would like to be called instead of .id
How can this be done?
This is what I tried
config.user.current = Proc.new {
_intercom_id = current_user.intercom_id
current_user.define_singleton_method(:id) { _intercom_id }
current_user
}
in combination with
config.user.custom_data = {
:id => Proc.new { |current_user| current_user.intercom_id },
...
but so far, no luck. I keep on getting the result of user.id in intercom.
Mongoid is a very mature ODM and is used instead of ActiveRecord by many applications. I'd love to see support for importing users from Mongoid added.
Hi,
I am getting a lot of errors from intercom JS tracked by bugsnag, I don't know if its related to using turbolinks.
Error attached:
TypeError: Uncaught TypeError: Cannot read property '$el' of undefined
https://js.intercomcdn.com/intercom.f74a6095.js:7:3246 n.b.extend.add
add:function(){a("body").append(this.view.render().$el),this.ready.resolve(),this.trigger("add")},rehttps://js.intercomcdn.com/intercom.f74a6095.js:8:22602 HTMLDocument.
https://js.intercomcdn.com/intercom.f74a6095.js:3:5191 HTMLDocument.fb.event.dispatch
https://js.intercomcdn.com/intercom.f74a6095.js:3:1871 HTMLDocument.q.handle
https://sexyonecoimbra.minestore.com.br/admin/produtos:6:9774 HTMLDocument.nrWrapper
https://duajuoiec0cnh.cloudfront.net/assets/admin-70f0f01dcd76c1f713805e57ce030037.js:7:28061 G
https://duajuoiec0cnh.cloudfront.net/assets/admin-70f0f01dcd76c1f713805e57ce030037.js:7:25940 h
https://duajuoiec0cnh.cloudfront.net/assets/admin-70f0f01dcd76c1f713805e57ce030037.js:7:24908 XMLHttpRequest.K.onload
https://sexyonecoimbra.minestore.com.br/admin/produtos:6:9774 XMLHttpRequest.nrWrapper
When current_user is a Mongoid model the id will serialize into {"$oid":"51bc552ed1c93ef363000001"}
rather than "51bc552ed1c93ef363000001"
which causes secure mode to never activate even though the secret key is valid.
For the time being I could get around to it by overriding the config.user.custom_data
with a lambda but the real solution would be to run .to_s
in the appropriate place.
Using Turbolinks, it works well when switching page and clicking the widget (it opens on a blank conversation). It only bugs when switching page after receiving a reply. The widget does not pop on the conversation window and can't trigger clicks. If I close the widget and open it again, it works.
Here's the behavior: https://dl.dropboxusercontent.com/u/7817397/screen.mov
We were able to successfully run the import on a test account, but were trying to go live today and now getting the 429 error back from Intercom when running the rake import:intercom
task. Should the task handle this already? Is this something we need to account for?
(This is gem version 0.2.26)
Hi,
I'm trying to run tests for this repo, but I get 16 failures similar to this:
16) Error:
test_delegates_to_script_tag_generate(ScriptTagHelperTest):
ArgumentError: wrong number of arguments (1 for 2)
/home/fregini/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/minitest/mock.rb:173:in `stub'
/home/fregini/Work/intercom-rails/test/intercom-rails/script_tag_helper_test.rb:10:in `test_delegates_to_script_tag_generate'
/home/fregini/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/minitest/unit.rb:1301:in `run'
/home/fregini/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/minitest/unit.rb:919:in `block in _run_suite'
/home/fregini/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/minitest/unit.rb:912:in `map'
/home/fregini/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/minitest/unit.rb:912:in `_run_suite'
/home/fregini/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/minitest/unit.rb:899:in `block in _run_suites'
/home/fregini/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/minitest/unit.rb:899:in `map'
/home/fregini/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/minitest/unit.rb:899:in `_run_suites'
/home/fregini/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/minitest/unit.rb:867:in `_run_anything'
/home/fregini/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/minitest/unit.rb:1060:in `run_tests'
/home/fregini/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/minitest/unit.rb:1047:in `block in _run'
/home/fregini/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/minitest/unit.rb:1046:in `each'
/home/fregini/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/minitest/unit.rb:1046:in `_run'
/home/fregini/Work/intercom-rails/test/intercom-rails/import_network_test.rb:43:in `_run'
/home/fregini/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/minitest/unit.rb:1035:in `run'
/home/fregini/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/minitest/unit.rb:789:in `block in autorun'
It happens on master branch and on tag 0.2.22 as well. Any clue on what's causing this?
Am I doing something wrong?
$ RAILS_ENV=staging be rake intercom:import
We couldn't find your user class, please set one in config/initializers/intercom_rails.rb
But when I run the app I can see the data was sent to Intercom so how this is not returning User
?
def user_klass
if IntercomRails.config.user.model.present?
IntercomRails.config.user.model.call
else
User
end
rescue NameError
# Rails lazy loads constants, so this is how we check
nil
end
And one more thing, this config/initializers/intercom_rails.rb
should be changed to config/initializers/intercom.rb
, right?
Thanks.
This needs to go next to our TRUSTE logo on the privacy policy page.
Just above the logo, in 8pt font or larger, we must include the text: "We self-certify compliance with:" The text must link to: https://safeharbor.export.gov/list.aspx
The image itself must link to: http://export.gov/safeharbor/
Thanks Dave - LMK if you have any questions!
The end users can see the default circle and speech bubble with a question mark, however, there's no New message
button at the bottom.
Am I missing some steps?
Given the 'production only' nature of intercom, it would be a good idea to me to avoid exceptions in custom data. I'm scared to put something in there which my tests will never catch.
em
element into your anchor with the count of unread messagesSo, I'm trying to write tests for some modification I made for the gem but I can't get it to run.
As far as I understand the gem use another gem(minitest) to run the tests but I can't get it to work.
Would be nice to update the README and explain how to run all the tests.
Thanks
After doing the very basic integration, I can see that's inbox icon is not hidden by default and it's causing an issue as it's not useful when I am on a free plan or want to use Intercom just to observe the users.
the user_hash attribute should be generated from the user_id attribute (if present) or the email
cause turbolinks doesn't fire page load event
I thought it would be as simple as adding the following to the initializer but it doesn't work:
IntercomRails.config do |config|
...
config.widget.activator = "#Intercom"
end
In my app, I rely on an environment variable in production to set the Intercom app ID. In development, I prefer that the code not load, primarily so I don't introduce development data into the production Intercom account.
However, after upgrading to the latest version of the intercom-rails
gem, I now have no choice about whether the tracking code is loaded or not, because the gem defaults to an app ID of `"abcd1234" in development.
Why is this default app ID set?
It also seems to be causing JavaScript errors along the lines of:
XMLHttpRequest cannot load https://api.intercom.io/api/messages/index. Origin http://myapp.dev is not allowed by Access-Control-Allow-Origin.
GET https://api.intercom.io/api/messages/index?[…]&callback=IntercomJSONP1357105264740&_=1357105264740 422 (Unprocessable Entity) library-9652678f34ecafeaf9ec23023c4ac38d.js:2
Hi!
The problem:
intercom_custom_data assignments is stored in controller's instance variable, that will be flushed after redirect.
I think the solution to this problem would be to store that data in session.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.