lib/pagelet_rails/concerns/controller.rb
module PageletRails::Concerns::Controller
extend ActiveSupport::Concern
included do
# order is important
include PageletRails::Concerns::ResponseWrapper
include PageletRails::Concerns::Routes
include PageletRails::Concerns::Options
include PageletRails::Concerns::Cache
include PageletRails::Concerns::Placeholder
include PageletRails::Concerns::Tags
include PageletsHelper
prepend_before_action :merge_original_pagelet_options
prepend_before_action :append_pagelet_view_paths
append_view_path 'app/pagelets/'
append_view_path 'test/dummy/app/pagelets/' if Rails.env.test?
layout :layout_name
helper_method :pagelet_request?
helper_method :pagelet_encoded_original_options
pagelet_options layout: 'container'
end
def layout_name
layout = params[:layout] || pagelet_options.layout
"pagelet_rails/#{layout}"
end
def pagelet_request?
request.headers['X-Pagelet'].present? || params[:target_container]
end
private
def append_pagelet_view_paths
# lookup_context.prefixes.clear
view = "#{controller_name}/views"
if lookup_context.prefixes.exclude?(view)
lookup_context.prefixes.unshift view
end
# https://github.com/rails/actionpack-action_caching/issues/32
if lookup_context.formats.exclude?(:html)
lookup_context.formats.unshift :html
end
end
def merge_original_pagelet_options
if params[:original_pagelet_options]
opts = PageletRails::Encryptor.decode(params[:original_pagelet_options])
pagelet_options(opts)
pagelet_options(original_options: opts)
end
end
def pagelet_encoded_original_options new_opts = {}
encode_data = pagelet_options.original_options.to_h
.with_indifferent_access.except('remote').deep_merge(new_opts)
PageletRails::Encryptor.encode(encode_data)
end
def pagelet_render_remotely?
case pagelet_options.remote
when :stream
render_remotely = true
when :turbolinks
# render now if request coming from turbolinks
is_turbolinks_request = request.headers['Turbolinks-Referrer'].present?
render_remotely = !is_turbolinks_request
when true, :ajax
render_remotely = true
when :ssi
render_remotely = true
else
render_remotely = false
end
render_remotely
end
def redirect_to *args
begin
redirect_url = url_for(*args)
path_opts = Rails.application.routes.recognize_path(redirect_url)
rescue ActionController::RoutingError
return super
end
controller_class = path_opts[:controller].camelize.concat('Controller').safe_constantize
is_pagelet = controller_class && controller_class.include?(PageletRails::Concerns::Controller)
if is_pagelet
options = args.extract_options!
new_params = options.merge(original_pagelet_options: pagelet_encoded_original_options)
render plain: pagelet(url_for(*args, new_params))
else
super
end
end
end