# application.js.erb
//= require signature_pad
# signature.js
function resizeCanvas(canvas) {
var ratio = Math.max(window.devicePixelRatio || 1, 1);
canvas.width = canvas.offsetWidth * ratio;
canvas.height = canvas.offsetHeight * ratio;
canvas.getContext("2d").scale(ratio, ratio);
}
$(document).on('turbolinks:load', function() {
var canvas = document.querySelector("canvas");
if (canvas){
canvas.height = canvas.offsetHeight;
canvas.width = canvas.offsetWidth;
window.onresize = resizeCanvas(canvas);
resizeCanvas(canvas);
signature_pad = new SignaturePad(canvas);
$('.signature_pad_clear').click(function() { signature_pad.clear() });
$('.signature_pad_save').click(function(event) {
if (signature_pad.isEmpty()){
alert('You must sign to accept the Terms and Conditions');
event.preventDefault();
} else {
$('.signature_pad_input').val(signature_pad.toDataURL());
}
});
}
});
# application.css
.signature_pad {
width: 700px;
height: 400px;
margin: 0 auto;
}
.signature_pad_body canvas {
width: 100%;
height: 100%;
border: dotted #444;
background: #CCCCCC;
}
# application_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
before_action :verify_terms_acceptance
private
def verify_terms_acceptance
unless user_signed_in? && current_user.document
redirect_to new_document_path, alert: 'You must first accept terms and conditions before performing any actions.'
end
end
end
# documents_controller.rb
class DocumentsController < ApplicationController
before_action :authenticate_user!
skip_before_action :verify_terms_acceptance
def new
@document = current_user.build_document
end
def create
@document = current_user.build_document(document_params)
@document.signed_on = DateTime.now
if @document.save
redirect_to root_url, notice: 'Terms and Conditions accepted.'
else
render :new
end
end
private
def document_params
params.require(:document).permit(:signature)
end
end
On controllers and/or specific actions which should not require the user to accept the Terms and Conditions, make sure that you add
# controller
skip_before_action :verify_terms_acceptance
Adding this override should also apply to the authentication controllers.
# documents/new.html.erb
<%= simple_form_for @document do |f| %>
<%= f.input_field :signature, as: :hidden, class: 'signature_pad_input' %>
<div class="signature_pad text-center">
<div class="signature_pad_body">
<canvas></canvas>
</div>
<div class="signature_pad_footer">
<div class="text-muted">Sign above</div>
<button type="button" class="btn btn-default signature_pad_clear">Clear</button>
<%= f.button :submit, 'Save', class: 'btn btn-success signature_pad_save' %>
</div>
</div>
<% end %>
# visitors/private_content.html.erb
<%= image_tag current_user.document.signature %>