naichi's lab

3日後の自分(他人)への書き置き

Rails、production実行時、assetsフォルダ以下がno route matchesでアクセス出来ない

productionで実行してみた

Railsチュートリアル、第3版でCloud9を使うようになったけど 勉強がてらローカル環境(RubyMine)で作り直してる。

で、10章まで終わってproduction環境でメール送信を試すために下記コマンドを実行。

$ bundle exec rails s -e production

localhost:3000にアクセス。

環境変数エラー

f:id:naichilab:20151108003646p:plain

はい、エラー。

環境変数がないのね。

$ bundle exec rake secret
d01383c....a9d419d(ながーい文字列が表示されるのでコピー)
$ export SECRET_KEY_BASE=d01383c....a9d419d
$ bundle exec rails s -e production

localhost:3000にアクセス。

CSSが無い…

f:id:naichilab:20151108004015p:plain

log/production.logを見ると

I, [2015-11-08T00:39:05.199573 #78762]  INFO -- : Started GET "/assets/rails-c094bc3a4bf50e5bb477109e5cb0d213af27ad75b481c4df249f50974dbeefe6.png" for ::1 at 2015-11-08 00:39:05 +0900
F, [2015-11-08T00:39:05.200579 #78762] FATAL -- : 
ActionController::RoutingError (No route matches [GET] "/assets/rails-c094bc3a4bf50e5bb477109e5cb0d213af27ad75b481c4df249f50974dbeefe6.png"):

No route matches!!!

なんでや。developmentでは動くのに。

ぐぐったらこんな記事出てきた。

stackoverflow.com

$ RAILS_ENV=production bundle exec rake assets:precompile

をしてから config/environments/production.rb の config.serve_static_files を true にしろって?

動いた

f:id:naichilab:20151108005108p:plain

rake assets:precompileが必要なのはわかるけどそのコマンドにRAILS_ENVを付ける理由がよくわからん。 あとserve_static_filesは何なのかさっぱり分からん。

まとめ

ローカル環境でのproduction実行には

config/environments/production.rb の config.serve_static_files を true にする。

下記コマンドで実行する。

$ bundle exec rake secret
d01383c....a9d419d(ながーい文字列が表示されるのでコピー)
$ export SECRET_KEY_BASE=d01383c....a9d419d
$ RAILS_ENV=production bundle exec rake assets:precompile
$ bundle exec rails s -e production

宿題

  • rake assets:precompile に RAILS_ENV が必要な理由
  • config.serve_static_files の意味を知る