HerokuのRailsでnpm installをできるようにする
1. 下記の手順に従ってrubyとnodejsのビルドパックを追加する
$ heroku buildpacks:add --index 1 heroku/nodejs Buildpack added. Next release on アプリ名 will use: 1. heroku/nodejs 2. heroku/ruby Run git push heroku master to create a new release using these buildpacks.
2. assets:precompileの前にnpm installを行うRakeタスクを作成する
[lib/tasks/before_precompile.rake] task :npm_install do sh "npm install" end Rake::Task["assets:precompile"].enhance(%i(npm_install))
手順2. は要らなさそう。Herokuがyarnをサポートしているようなのでyarn.lockファイルがあるとyarn installが自動で走るみたい。
herokuのDBをローカルのDB(Docker)にリストアする
1. herokuのDBのバックアップを取得する
下記のコマンドを実行。
heroku pg:backups capture --app アプリ名
2. herokuのDBのコンソール画面でバックアップしたファイルをダウンロード
コマンドからでもできるみたいだけど、今回は画面から。
herokuのダッシュボードから行くか、https://data.heroku.com/へアクセスした対象のDBへ行ってダウンロードボタンを押す。
3. Dockerのpostgresqlへインポート
下記のコマンドを実行。
cat ダウンロードしたバックアップファイル | docker exec -i [container_id or name] pg_restore --verbose --clean --no-acl --no-owner -U ユーザ名 -d DB名
以上。
administrateでacts-as-taggable-onと連携できるようにする
最近、管理画面をadministrateで作ってみたが、 acts-as-taggable-onが設定されたモデルをうまく表示する方法が分からなかった。。
試行錯誤の結果、一応できるようになったのでメモとして残す。
やったこと
- app/dashboards/xxx_dashboard.rbにtagsをField::HasManyで定義
- acts_as_taggable_onのtagとtaggingのdashboardを生成
- 生成したdashboard/controllerを移動・修正
- config/routes.rbの設定
app/dashboards/xxx_dashboard.rbにtagsをField::HasManyで定義
acts_as_taggableを定義しているモデルのxxx_dashboard.rbにtagsを定義する。
(例えば、bookモデルにacts_as_taggableを定義している場合はbook_dashboard.rb)
ATTRIBUTE_TYPES = { # ... tags: Field::HasMany.with_options(class_name: "::ActsAsTaggableOn::Tag"), } COLLECTION_ATTRIBUTES = { # ... :tags, } SHOW_PAGE_ATTRIBUTES = { # ... :tags, } FORM_ATTRIBUTES = { # ... :tags, }
administrateのField::HasManyができると編集画面などで便利なので、Field::HasManyでできるようにするのが目標だった。
acts_as_taggable_onのtagとtaggingのdashboardを生成
administrateのgenarateコマンドを実行する。
$ bundle exec rails generate administrate:dashboard ActsAsTaggableOn::Tag $ bundle exec rails generate administrate:dashboard ActsAsTaggableOn::Tagging
生成したdashboardを移動・修正
$ mkdir app/dashboards/acts_as_taggable_on $ mkdir app/controllers/admin/acts_as_taggable_on $ mv app/dashboards/tag_dashboard.rb app/dashboards/acts_as_taggable_on/ $ mv app/controllers/admin/tags_controller.rb app/controllers/admin/acts_as_taggable_on/ $ mv app/dashboards/tagging_dashboard.rb app/dashboards/acts_as_taggable_on/ $ mv app/controllers/admin/taggings_controller.rb app/controllers/admin/acts_as_taggable_on/
生成したままのclass ActsAsTaggableOn::TagDashboard
などのままでもいいが、私は下記のようにmoduleでネームスペースを切るようにした。
module ActsAsTaggableOn class TagDashboard < Administrate::BaseDashboard #... # Overwrite this method to customize how tags are displayed # across all pages of the admin dashboard. # def display_resource(tag) ←コメントアウトされているのを解除。ここが新規/編集時のtagsに表示される項目名になる tag.name end end end
module ActsAsTaggableOn class TaggingDashboard < Administrate::BaseDashboard #... end end
module Admin module ActsAsTaggableOn class TagsController < Admin::ApplicationController # ... end end end
module Admin module ActsAsTaggableOn class TaggingsController < Admin::ApplicationController # ... end end end
config/routes.rbの設定
各画面でacts-as-taggable-on関連のパスも生成しようとするのでroutes.rbの設定をしておく。
namespace :admin do #... namespace :acts_as_taggable_on do resources :tags resources :taggings end end
これで、acts-as-taggable-onを利用しているモデルのdashboardでもCRUDがhas_manyと同様でできるようになる。
ただ、tagやtaggingは表示のみで新規/編集/削除が画面からできないのでできるようにしたいところ(まだ、直近で必要無いので今は保留)
ネームスペースで区切られたモデルはまだサポートされてなさそう。 下記のpull requestが取り込まれると解決するか?
2017/06/27 追記
最新のmasterブランチだと上記のpull requestも取り込まれていて、HasOneもサポートされています!
一応、Qiitaの方にも投稿しておいた。 qiita.com
HerokuのDBにimportする
下記のコマンドを実行。
heroku pg:psql --app アプリ名 DATABASE_URL < sqlファイル
※dockerでpostgresqlをインストールして利用している場合は、ローカルにpostgresqlをインストールしていないと怒られる
herokuでridgepole用のDB設定をする
まあ、下記にある通りなんだけど。
herokuのpostgresqlのDATABASE_URLは下記のような形式になっているので、config/database.ymlをそれように変更する。
postgres://username:password@hostname:5432/db_name