mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
DEV: Improve Ember CLI's bootstrap logic (#12792)
* DEV: Give a nicer error when `--proxy` argument is missing * DEV: Improve Ember CLI's bootstrap logic Instead of having Ember CLI know which URLs to proxy or not, have it try the URL with a special header `HTTP_X_DISCOURSE_EMBER_CLI`. If present, and Discourse thinks we should bootstrap the application, it will instead stop rendering and return a HTTP HEAD with a response header telling Ember CLI to bootstrap. In other words, any time Rails would otherwise serve up the HTML for the Ember app, it stops and says "no, you do it." * DEV: Support asset filters by path using a new options object Without this, Ember CLI's bootstrap would not get the assets it wants because the path it was requesting was different than the browser path. This adds an optional request header to fix it. So far this is only used by the styleguide.
This commit is contained in:
@@ -107,9 +107,23 @@ class ApplicationController < ActionController::Base
|
||||
|
||||
class RenderEmpty < StandardError; end
|
||||
class PluginDisabled < StandardError; end
|
||||
class EmberCLIHijacked < StandardError; end
|
||||
|
||||
def catch_ember_cli_hijack
|
||||
yield
|
||||
rescue ActionView::Template::Error => ex
|
||||
raise ex unless ex.cause.is_a?(EmberCLIHijacked)
|
||||
send_ember_cli_bootstrap
|
||||
end
|
||||
|
||||
rescue_from RenderEmpty do
|
||||
with_resolved_locale { render 'default/empty' }
|
||||
catch_ember_cli_hijack do
|
||||
with_resolved_locale { render 'default/empty' }
|
||||
end
|
||||
end
|
||||
|
||||
rescue_from EmberCLIHijacked do
|
||||
send_ember_cli_bootstrap
|
||||
end
|
||||
|
||||
rescue_from ArgumentError do |e|
|
||||
@@ -286,13 +300,19 @@ class ApplicationController < ActionController::Base
|
||||
rescue Discourse::InvalidAccess
|
||||
return render plain: message, status: status_code
|
||||
end
|
||||
with_resolved_locale do
|
||||
error_page_opts[:layout] = opts[:include_ember] ? 'application' : 'no_ember'
|
||||
render html: build_not_found_page(error_page_opts)
|
||||
catch_ember_cli_hijack do
|
||||
with_resolved_locale do
|
||||
error_page_opts[:layout] = opts[:include_ember] ? 'application' : 'no_ember'
|
||||
render html: build_not_found_page(error_page_opts)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def send_ember_cli_bootstrap
|
||||
head 200, content_type: "text/html", "X-Discourse-Bootstrap-Required": true
|
||||
end
|
||||
|
||||
# If a controller requires a plugin, it will raise an exception if that plugin is
|
||||
# disabled. This allows plugins to be disabled programatically.
|
||||
def self.requires_plugin(plugin_name)
|
||||
|
||||
Reference in New Issue
Block a user