例えばEngine側のコントローラーを以下のようにApplicationController
を親として定義しているとする。
class Nyauth::Base < ApplicationController
end
ApplicationController
を継承する理由は
- layoutはマウント元アプリ側のものを使いたい
- ApplicationControllerにある共通処理をEngine側のControllerでも使いたい
と言ったあたり。
この時地味に困るケースが有る。
- before_actionなどで、マウント元アプリ側のurl helperを、
main_app.
とか付けずに普通に使いたいケース - layouts/application内にマウント元アプリ側のurl helperを、
main_app.
とか付けずに普通に使いたいケース
こんな時は、以下みたいなhelperを用意しておいて
module Nyauth
module ApplicationHelper
# engine側からmain_app側のurl helperを呼ぶ事ができるようにしておく
# ApplicationControllerに記載されているbefore_actionで参照するケースや
# layoutに記載されているlinkから参照されるケースがありうる
def method_missing method, *args, &block
if method.in? Rails.application.routes.url_helpers.instance_methods
main_app.send(method, *args)
else
super
end
end
end
end
マウント元アプリ側で
class ApplicationController < ActionController::Base
include Nyauth:: ApplicationHelper
helper Nyauth:: ApplicationHelper
end
みたいな感じで使うと、いいかも。
代替案
main_app.
を全部のURL helperにつける