環境
- Ruby 2.2.3
- Rails 4.2.4
Rails4.2.4で、Mountable Engineを使おうとして設定している際に、
サブドメインの設定ではまったので、設定手順とあわせて、はまったポイントをメモ。
Mountable Engineを作成
$ rails plugin new myenginename --mountable
上記コマンドを実行すると、app/の下に、myenginenameというディレクトリが作成され、
その中身は、Railsとほぼ同じ構成になっている。
Railsの中にさらにRailsがインストールされた感じ。
Gemfileに追記
次に、親アプリケーションのGemfileに下記の記述をし、
親アプリケーションから呼び出せるようにする。
gem "myenginename", path: "myenginename"
mount設定
次に、親アプリケーションのconfig/routes.rbで、mountの設定。
方法は2通り。
1, 階層を切る場合
http://サイトドメイン/myenginename
でアクセスさせる場合は下記の設定。
mount Myenginename::Engine => '/myenginename'
2, サブドメインでアクセス可能にする場合
下記の記述をすると、
mountしたEngineに、サブドメインでアクセスできるようになるらしい。
ex)http://myenginename.ドメイン/
mount Myenginename::Engine => '/', constraints { subdomain: 'myenginename' }
しかし!! この設定をしたら、railsコマンドでエラーが出るようになった!
例えばrails sをすると
$ rails s
(略)
/home/myuser/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.4/lib/active_support/dependencies.rb:268:in
`load': /home/myuser/htdocs/config/routes.rb:64: syntax error, unexpected ':', expecting '}' (SyntaxError)
mount Myenginename::Engine => '/', constraints { subdomain: 'myenginename' }
syntax errorが出る。
なぜだ?参考記事の手順通りにやったのに。。。
よくよく見てみると、参考記事に書かれている、config/routes.rbの構文に間違いが・・・
正しくは下記だった。
mount Myenginename::Engine => '/', constraints: { subdomain: 'myenginename' }
「constraints」のうしろにコロンが必要だった。
ただそれだけ(汗)
気を取り直して、設定の続きを。
gemspecの設定
作成したEngineのディレクトリの直下にある、gemspecファイルの設定をする。
$:.push File.expand_path("../lib", __FILE__)
# Maintain your gem's version:
require "myenginename/version"
# Describe your gem and declare its dependencies:
Gem::Specification.new do |s|
s.name = "myenginename"
s.version = myenginename::VERSION
s.authors = ["authorname"]
s.email = ["メールアドレス"]
s.homepage = "サイトのURL"
s.summary = "アプリケーションの説明"
s.description = "アプリケーションの説明"
s.license = "MIT"
s.files = Dir["{app,config,db,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.rdoc"]
s.test_files = Dir["test/**/*"]
s.add_dependency "rails", "~> 4.2.4"
s.add_development_dependency "sqlite3"
end
これで、基本的な設定は完了。
下記の記事を参考にしました。
[参考]
新規サービスの管理画面を短期間で見栄え良く実装する
[関連記事]
Rails4のMountable Engineで、link_toに:method => deleteを指定しても、Getアクセスになってしまう