Rails 5 API 有前端引擎
Rails 5 API with front-end engine
我有一个 Rails 5 API devise/doorkeeper 完美运行。
我构建了一个引擎,其前端部分包含所有设计视图。除非典狱长抛出错误,否则一切正常。我手动导入了缺失的模块:
# app/controllers/concerns/api_to_web_controller.rb
module ApiToWebController
extend ActiveSupport::Concern
included do
include ActionController::Helpers
include ActionController::MimeResponds
include ActionController::Redirecting
include ActionView::Layouts
include ActionController::EtagWithFlash
include ActionController::Flash
respond_to :html
end
end
# app/controllers/concerns/devise_api_to_web.rb
##
# Module to integrate Devise:
# - helpers
# - layout
# It also redefine `redirect_to`.
# See https://github.com/heartcombo/responders/issues/222
# for more details
module DeviseApiToWeb
extend ActiveSupport::Concern
included do
layout 'secret_migration/devise'
if respond_to?(:helper_method)
helpers = %w[resource scope_name resource_name signed_in_resource
resource_class resource_params devise_mapping]
helper_method(*helpers)
end
def redirect_to(options = {}, response_options = {})
super
end
end
end
这是我的习惯SessionController
module MyEngine
module V1
# Override Devise::SessionsController
class Users::SessionsController < Devise::SessionsController
include ::ApiToWebController
include ::DeviseApiToWeb
end
end
end
我有这个习惯after_authentication
# config/initializers/warden.rb
Warden::Manager.after_authentication do |user, auth, _opts|
next if user.is_ok?
throw(:warden, :message => "User not ok, contact admin")
end
最后,申请文件
module MyApp
class Application <
opts = { key: '_my_app', domain: 'example.com', tld_length: 1 }
Rails::ApplicationRails.application.config.session_store :disabled
config.session_store :cookie_store, opts
config.middleware.use ActionDispatch::Session::CookieStore, config.session_options
config.middleware.insert_after(ActionDispatch::Cookies, ActionDispatch::Session::CookieStore,
opts)
我已经能够跟踪数据。 env[warden.options]
很好地填充了 :message => "User not ok, contact admin"
但是不知何故,它在重定向后没有通过。
重要的一点,当它是像 Invalid Email or password.
这样的纯设计错误时,我收到了闪现消息。
我明白了。这是一个中间件订单问题。它必须符合以下顺序
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use Warden::Manager
我更新了 engine.rb
以在正确的位置包含中间件
module MyEngine
##
# Engine initializers
class Engine < ::Rails::Engine
isolate_namespace MyEngine
initializer 'use action dispatch flash' do |app|
app.config.middleware.insert_after(ActionDispatch::Session::CookieStore, ActionDispatch::Flash)
app.config.middleware.use Rack::MethodOverride
end
end
end
# config/application.rb
module MyApp
class Application < Rails::Application
# ...
config.middleware.insert_before(Warden::Manager, ActionDispatch::Cookies)
# ...
end
end
# config/environments/development.rb
Rails.application.configure do
opts = { key: '_my_app', domain: 'lvh.me', tld_length: 2 }
Rails.application.config.session_store :disabled
config.session_store :cookie_store, opts
config.middleware.insert_after(ActionDispatch::Cookies, ActionDispatch::Session::CookieStore,
opts)
end
我有一个 Rails 5 API devise/doorkeeper 完美运行。
我构建了一个引擎,其前端部分包含所有设计视图。除非典狱长抛出错误,否则一切正常。我手动导入了缺失的模块:
# app/controllers/concerns/api_to_web_controller.rb
module ApiToWebController
extend ActiveSupport::Concern
included do
include ActionController::Helpers
include ActionController::MimeResponds
include ActionController::Redirecting
include ActionView::Layouts
include ActionController::EtagWithFlash
include ActionController::Flash
respond_to :html
end
end
# app/controllers/concerns/devise_api_to_web.rb
##
# Module to integrate Devise:
# - helpers
# - layout
# It also redefine `redirect_to`.
# See https://github.com/heartcombo/responders/issues/222
# for more details
module DeviseApiToWeb
extend ActiveSupport::Concern
included do
layout 'secret_migration/devise'
if respond_to?(:helper_method)
helpers = %w[resource scope_name resource_name signed_in_resource
resource_class resource_params devise_mapping]
helper_method(*helpers)
end
def redirect_to(options = {}, response_options = {})
super
end
end
end
这是我的习惯SessionController
module MyEngine
module V1
# Override Devise::SessionsController
class Users::SessionsController < Devise::SessionsController
include ::ApiToWebController
include ::DeviseApiToWeb
end
end
end
我有这个习惯after_authentication
# config/initializers/warden.rb
Warden::Manager.after_authentication do |user, auth, _opts|
next if user.is_ok?
throw(:warden, :message => "User not ok, contact admin")
end
最后,申请文件
module MyApp
class Application <
opts = { key: '_my_app', domain: 'example.com', tld_length: 1 }
Rails::ApplicationRails.application.config.session_store :disabled
config.session_store :cookie_store, opts
config.middleware.use ActionDispatch::Session::CookieStore, config.session_options
config.middleware.insert_after(ActionDispatch::Cookies, ActionDispatch::Session::CookieStore,
opts)
我已经能够跟踪数据。 env[warden.options]
很好地填充了 :message => "User not ok, contact admin"
但是不知何故,它在重定向后没有通过。
重要的一点,当它是像 Invalid Email or password.
这样的纯设计错误时,我收到了闪现消息。
我明白了。这是一个中间件订单问题。它必须符合以下顺序
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use Warden::Manager
我更新了 engine.rb
以在正确的位置包含中间件
module MyEngine
##
# Engine initializers
class Engine < ::Rails::Engine
isolate_namespace MyEngine
initializer 'use action dispatch flash' do |app|
app.config.middleware.insert_after(ActionDispatch::Session::CookieStore, ActionDispatch::Flash)
app.config.middleware.use Rack::MethodOverride
end
end
end
# config/application.rb
module MyApp
class Application < Rails::Application
# ...
config.middleware.insert_before(Warden::Manager, ActionDispatch::Cookies)
# ...
end
end
# config/environments/development.rb
Rails.application.configure do
opts = { key: '_my_app', domain: 'lvh.me', tld_length: 2 }
Rails.application.config.session_store :disabled
config.session_store :cookie_store, opts
config.middleware.insert_after(ActionDispatch::Cookies, ActionDispatch::Session::CookieStore,
opts)
end