パパエンジニアのアウトプット帳

30歳に突入した1児のパパエンジニアのブログ

HerokuのRailsでnpm installをできるようにする

1. 下記の手順に従ってrubyとnodejsのビルドパックを追加する

devcenter.heroku.com

$ 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が自動で走るみたい。

devcenter.heroku.com

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とtaggingdashboardを生成
  • 生成した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とtaggingdashboardを生成

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が取り込まれると解決するか?

Add support for namespaced models by shvetsovdm · Pull Request #871 · thoughtbot/administrate · GitHub

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設定をする

まあ、下記にある通りなんだけど。

www.wantedly.com

herokuのpostgresqlのDATABASE_URLは下記のような形式になっているので、config/database.ymlをそれように変更する。

postgres://username:password@hostname:5432/db_name