apisync-rails
This gem gives you the tools to keep your product models synchronized with ApiSync.
- DSL: built-in DSL for ActiveRecord models that pushes your data automatically to apisync.io.
- Sidekiq: when Sidekiq is present, this gem will push data asynchronously. Otherwise, it will fallback to pushing data synchronously. We strongly recommend using Sidekiq so errors are handled automatically for you.
If you're not using Rails with ActiveRecord, please use apisync-ruby instead.
Installation
Add this line to your application's Gemfile:
gem 'apisync-rails'
And then execute:
$ bundle
Usage
Step 1: API Key: in config/initializers/apisync.rb
, define your
key:
Apisync.api_key = ENV["APISYNC_API_KEY"];
Step 2: setup your models: you need to define which attributes in your product models map to the attributes in ApiSync.
Some attributes are required. See the API reference for details.
class Product < ActiveRecord::Base
apisync do
# should the current item be synchronized?
# remove it to always sync all items
sync_if :should_sync?
# Required attributes
attribute :ad_template_type, from: :category
attribute :available, from: :active?
attribute :content_language, value: "pt-br"
# Recommended attributes
attribute :brand, from: :manufacturer
attribute :condition, from: :normalize_condition
attribute :description
attribute :images
attribute :link
attribute :model
attribute :price
attribute :reference_id, from: :id # optional, defaults to :id
attribute :title
attribute :year
# Custom attributes
custom_attribute :city, identifier: 'city-name', label: 'City name'
end
private
def should_sync?
true
end
# required format (see reference docs)
def images
[{
url: "https://page.com/image1.jpg",
order: 1
}, {
url: "https://page.com/image2.jpg",
order: 2
}]
end
# required format (see reference docs)
def price
{
amount: 1234, # equivalent to R$12,34
currency: "BRL"
}
end
# Custom attribute
def city
self.address.city
end
end
Step 3: test on the console: on the Rails console, try saving the model. The request and response should show up.
You can turn off these logs, use Apisync.verbose = false
.
Explanation
sync_if defines if the item should be synchronized. The method with the
name of the symbol will be called. When true
, the item will be saved on
ApiSync. Remove this if you always want to push to ApiSync (recommended).
attribute specifies one value to be sent to ApiSync. Pass the
attribute name as parameter, e.g attribute :brand
.
from specifies what method has the values for the
respective attribute. If you leave it blank then we'll default to the attribute
name, e.g attribute :brand
will call def brand
whereas attribute :brand, from: :manufacturer
will call def manufacturer
.
value specifies a value for the respective attribute. Ideal for values that don't change.
custom_attribute allows you to specify an attribute that is not part of the documentation. You can use these to create richer ad templates.
Reference ID
The reference_id attribute is extremely important. We use the attribute to
keep track of the record's state. The first time a record is sent, ApiSync
creates it and saves the reference id. The second time a record is sent it
knows that it only needs to be updated, not created.
If you omit reference_id
, we will keep creating the same record
over and over.
By default, reference_id
is set to whatever id value is. You can
customize it, e.g attribute :reference_id, from: :my_custom_id
.
Failed requests
A warning
will be logged (Rails.logger.warn
) whenever a request fails.
In asynchronous cases (e.g Sidekiq), an exception will be raised
(Apisync::RequestFailed
) so jobs can be retried.
Note on callbacks
This gem uses Rails' callbacks to trigger synchronization.
If you're bypassing methods like after_commit
,
no data will be sent to ApiSync. For example, update_attribute
doesn't
perform validations checks, so please use update_attributes
instead.
TooManyRequests
When too many simultaneous requests are being made, a 429 status code will be returned from the server to indicate to the client to slow down.
When using Sidekiq, this lib's algorithm will automatically throttle (slow down)
the requests. When not using any queue gem, Apisync::TooManyRequests
exception
will be raised and you will have to catch it, therefore
we strongly recommend using Sidekiq.
Without Sidekiq, an ActiveRecord's after_commit
callback is used so the exception
shouldn't prevent your record from being saved to the database, but you have
to rescue it manually.
Development
After checking out the repo, run bin/setup
to install dependencies. Then, run rake spec
to run the tests. You can also run bin/console
for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run bundle exec rake install
. To release a new version, update the version number in version.rb
, and then run bundle exec rake release
, which will create a git tag for the version, push git commits and tags, and push the .gem
file to rubygems.org.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/apisync/apisync-rails.
License
The gem is available as open source under the terms of the MIT License.