diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e43728..c443a3c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # CHANGELOG +## 0.1.3 (unreleased) + * Add custom Responder + ## 0.1.2 * Add RablRails#render method (see README or source code) * Fix fail when JSON engine is not found. Now fallback to MultiJson.default_adapter diff --git a/lib/rabl-rails.rb b/lib/rabl-rails.rb index 7426b84..d6b645b 100644 --- a/lib/rabl-rails.rb +++ b/lib/rabl-rails.rb @@ -17,31 +17,41 @@ require 'multi_json' module RablRails extend Renderer - + + autoload :Responder, 'rabl-rails/responder' + mattr_accessor :cache_templates @@cache_templates = true - + mattr_accessor :include_json_root @@include_json_root = true mattr_reader :json_engine @@json_engine = :yajl + mattr_accessor :use_custom_responder + @@use_custom_responder = false + + mattr_accessor :responder_default_template + @@responder_default_template = 'show' + def self.configure yield self + + ActionController::Base.responder = Responder if self.use_custom_responder end - + def self.json_engine=(name) MultiJson.engine = name @@json_engine = name rescue LoadError Rails.logger.warn %Q(WARNING: rabl-rails could not load "#{self.json_engine}" as JSON engine, fallback to default) end - + def self.cache_templates? ActionController::Base.perform_caching && @@cache_templates end - + def self.load_default_engines! self.json_engine = :yajl end diff --git a/lib/rabl-rails/responder.rb b/lib/rabl-rails/responder.rb new file mode 100644 index 0000000..fb094bc --- /dev/null +++ b/lib/rabl-rails/responder.rb @@ -0,0 +1,22 @@ +module RablRails + # + # Override default responder's api behavior to not + # user to_format methods on a resource as a default + # representation but instead use a rabl template + # + class Responder < ActionController::Responder + protected + + def api_behavior(error) + rabl_options = options.merge(template: RablRails.responder_default_template) + + if get? + controller.default_render rabl_options + elsif post? + controller.default_render rabl_options.merge!(status: :created, location: api_location) + else + head :no_content + end + end + end +end \ No newline at end of file