Help us understand the problem. What is going on with this article?

Engine側からどういうわけかmain_appのURL helperを使いたい

More than 3 years have passed since last update.

例えば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につける

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした