Cachai
A clean way to add support for comments and pingbacks in your Rack app. Si pos weon.
Setting up
First you need to create a config/database.yml file, as you'd have on a regular Rails app, or if using Sinatra::ActiveRecord.
# database.yml
development:
adapter: sqlite3
database: db/development.sqlite3
pool: 16
Now insert the middleware before the app, either in your rackup file or in the app itself. We'll go with method one.
# rackup.ru
require 'sinatra'
require 'cachai'
map '/' do
use Cachai::Middleware, { domain: 'yourdomain.com' }
run Sinatra::Application
end
Now, the next time the app is loaded, Cachai will set up the necessary tables in the database provided. Basically a posts
table and a responses
one.
Posting new comments
Now, to send our first comment to Cachai, let's insert a form within your blog post view.
# views/blog/post.erb (or something like it)
...
<form action="/comments" method="post" id="comment-form">
<input type="hidden" name="url" value="http://yourdomain.com/path/to/your/blog/post" />
<input type="text" name="author_name" />
<input type="email" name="author_email" />
<input type="text" name="author_url" />
<textarea name="content"></textarea>
</form>
Now load your app and try submitting a comment. It should work.
Posting comment using AJAX
Using Javascript, you'd do something like this:
// app.js
$(function() {
$('#comment-form').on('submit', function(e) {
e.preventDefault();
var data = {
author_name : this.author_name.value,
author_email : this.author_email.value,
author_url : this.author_url.value,
content : this.content.value,
protocol : window.location.protocol,
domain : 'yourdomain.com',
path : encodeURI(window.location.pathname)
}
$.ajax({
type : 'post',
data : JSON.stringify(data),
url : '/comments.json',
success : function() { alert('Thanks!') },
error : function() { alert('Oh rats. Try again please.') },
})
})
})
Reading comments via AJAX
You get them using GET /comments.json.
// app.js
var domain = 'yourdomain.com',
path = encodeURI(window.location.pathname),
url = '/comments.json?callback=?&domain=' + domain + '&path=' + path;
$.ajax({
dataType : 'json',
url : url,
success : function(list) { /* render comments */ }),
error : function(err) { alert('Damn!') }
});
}
Or if you wish to insert them in the view itself.
# views/blog/post.erb
<ul id="comments">
<% Cachai.get_comments_for(@post.url).each do |comment| %>
<li>
<strong><%= comment.author_name %></strong>
<strong><%= simple_format(comment.content) %></strong>
</li>
<% end %>
</ul>
Small print.
(c) 2016 Tomas Pollak. MIT Licensed.