From dce6e597721fbcf3e6649630558107459333f655 Mon Sep 17 00:00:00 2001 From: Andrey Krivko Date: Mon, 29 Sep 2014 17:16:33 +0700 Subject: [PATCH] Auto-include url_helpers for Rails-apps. Fixes #563 --- lib/active_model/serializer/railtie.rb | 8 +++++ test/test_helper.rb | 2 ++ .../serializer/url_helpers_test.rb | 35 +++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 test/unit/active_model/serializer/url_helpers_test.rb diff --git a/lib/active_model/serializer/railtie.rb b/lib/active_model/serializer/railtie.rb index f12b6058..4c7840a2 100644 --- a/lib/active_model/serializer/railtie.rb +++ b/lib/active_model/serializer/railtie.rb @@ -6,5 +6,13 @@ module ActiveModel require 'active_model/serializer/generators/serializer/scaffold_controller_generator' require 'active_model/serializer/generators/resource_override' end + + initializer 'include_routes.active_model_serializer' do |app| + ActiveSupport.on_load(:active_model_serializers) do + include app.routes.url_helpers + end + end end end + +ActiveSupport.run_load_hooks(:active_model_serializers, ActiveModel::Serializer) diff --git a/test/test_helper.rb b/test/test_helper.rb index d207b040..b1bc95d0 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -20,5 +20,7 @@ end ActionController::TestCase.class_eval do def setup @routes = TestHelper::Routes + + Rails.application.routes.default_url_options[:host] = 'http://example.com' if defined?(Rails) end end diff --git a/test/unit/active_model/serializer/url_helpers_test.rb b/test/unit/active_model/serializer/url_helpers_test.rb new file mode 100644 index 00000000..70bea645 --- /dev/null +++ b/test/unit/active_model/serializer/url_helpers_test.rb @@ -0,0 +1,35 @@ +require 'test_helper' + +module ActiveModel + class Serializer + class UrlHelpersTest < Minitest::Test + include Rails.application.routes.url_helpers + + def setup + Object.const_set 'UserController', Class.new(ActionController::Base) do + def show + render text: 'profile' + end + end + + Rails.application.routes.draw do + get '/profile/:id', as: :profile, controller: :user, action: :show + end + end + + def test_url_helpers_are_available + serializer = Class.new(ActiveModel::Serializer) do + attributes :url + + def url + profile_url(id: object.object_id) + end + end + profile = Profile.new + + assert_equal({ url: profile_url(id: profile.object_id) }, + serializer.new(profile).as_json) + end + end + end +end