【M1 Mac】Rails×Docker環境でbundle installが通らないときに確認すること
結論
M1 Macであることは関係なく、メモリ割り当てが少なかった。
Dockerのメモリ設定が初期の2GBになってたので6GBに設定したら解決しました。
起きたこと(タイトルの内容)
Docker上でRailsの環境構築をしている際、 bundle install
が途中でKilled
になる
解決法
🐳→Preferences→Resources→Advanced→Memory を変更
自分は6GBにしましたがスペックに合わせてください。
その他の問題(M1 Mac特有?)
MySQLコンテナが使えない
docker-compose.ymlの抜粋です
変更前
db: image: mysql:5.7
変更後
db: image: mysql:5.7 platform: linux/x86_64 # ←この行を追加
参考
yarn を入れるコマンドでno valud opengpg data found
変更前
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
変更後
RUN wget --quiet -O - /tmp/pubkey.gpg https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo 'deb http://dl.yarnpkg.com/debian/ stable main' > /etc/apt/sources.list.d/yarn.list
参考
CircleCIのaws-ecs Orbで指定するオプションについて
はじめに
GUIからECSを設定したのでfamilyという単語に聞き覚えがなかったり、自分の設定ファイルではservice名を指定していないのに動いたりと不思議が多かったのでメモ
よく使うオプション
family
- タスク定義名
- 最初は「何故task-nameじゃなくてfamily..?」と思いましたが、タスク定義の詳細画面でJSONタブを開いてみるとタスク名が
family
の値になっているので「もともとそういう名前なのか...」と気づくことができます
cluster-name
- クラスター名(そのまんまですね)
container-image-name-updates
- タスク定義内のコンテナのイメージを更新するためのオプション
container=<container-name>,image-and-tag=<image-name>:<tag-name>|image=<image-name>|tag=<tag-name>,container=...,image-and-tag|image|tag=...,
- 複数指定したい場合は、
container=<container-name>,image-and-tag=<image-name>,container=<container-name>,image-and-tag=<image-name>...
のようにコンマで繋いでいく - containerは必須で、imageの指定法が、
- image名のみ
- タグは更新前のタスク定義のものを使用
- tagのみ
- イメージは更新前のタスク定義のものを使用
- image名とtag
- image名のみ
- 複数指定したい場合は、
service-name
- サービス名
- 指定しなかった場合は
family
の値が使用されます -個人的にプチハマりポイントだと思います。サービスとタスク定義の名前を同じにしていて
参考文献
https://circleci.com/orbs/registry/orb/circleci/aws-ecs?version=1.3.0#jobs-deploy-service-update
accepts_nested_attributes_for で、 "no implicit conversion of Symbol into Integer" エラーが出るときに確認すること
accepts_nested_attributes_forとは
Railsで関連テーブルを関連元と同時に保存する機能
accepts_nested_attributes_for の設定例
関連元モデル
class User < ApplicationRecord has_many :devices accepts_nested_attributes_for :devices end
関連先モデル
class Device < ApplicationRecord belongs_to :user end
controllerのストロングパラメータ
params.require(:user).permit( :name, :email, devices_attributes: [ :name ] )
起きたことと解決法
{ "user": { "name": "taro", "email": "aa@example.com", "devices_attributes": { "name": "phone" } } }
上記のパラメータを
InsomniaからPOSTした際に、
no implicit conversion of Symbol into Integer
が発生
一見意味がわかりませんでしたが、ストロングパラメータをよく見ると、devices_attributesが配列になっているではありませんか!
ということで、パラメータを
{ "user": { "name": "taro", "email": "aa@example.com", "devices_attributes": [ {"name": "phone"} ] } }
に変更するとスパッと通りました
ECS (EC2起動タイプ) 他のコンテナに接続できない
背景
Railsの環境構築中、redisとappコンテナの接続をする必要があったのですが、ありとあらゆるホスト名を試しても接続できませんでした。
そこで、普段docker-composeを利用しているように書く方法はないかと思ったら普通に存在して驚いたので書き残そうと思った次第であります。
前提
- ECS EC2起動タイプ
- タスク定義のネットワークモード:default
ECSの設定
タスク定義→コンテナの定義→link で、
{リンクしたいコンテナの名前}:{接続する際の名前}, {リンクしたいコンテナの名前}:{接続する際の名前}, ...
のように書けるそうです。
特にこだわりがなければ、
redis:redis
のようにすれば、コンテナ名と接続する際の名前が同じになってわかりやすいと思います
RailsでRedis設定をしている人向け
(Railsのredis設定)
config/environments/●●.rb に
config.cache_store = :redis_cache_store, { url: 'redis://redis/0/cache', expires_in: 90.minutes }
を追記
Rails enumではないカラムで値のパターンがある場合の日本語化
記事を書いた動機
Railsの日本語化で、元カラムがintegerでenumを使っている場合の日本語化はenum_helpというgemを使えば簡単なのですが、
そうではないパターンで、元カラムがstringで、enumも使っていない場合の日本語化はどうすればいいのか少し悩んだ為
(activeadmin使用中に悩んだので、activeadminでの使用例も載せています)
問題と解決法
やりたかったこと
- Documentテーブルのstatusというカラム(仮)が、stringで管理されているが日本語化対応したい
- 入る文字のパターンは決まっているが、諸事情でenumによる管理はできない
解決法
- ja.yml
ja: document: status: approved: 承認 denied: 否認 checking: 確認中
- 表示部分
# statusにはstatusの実際の値が入ります I18n.t("document.status.#{status}")
activeadminで使った例
- index画面
column :status do |document| I18n.t("document.status.#{document.status}") end
activeadminでcssが読み込まれない(staging, production環境)
記事を書いた動機
- staging環境(productionと同じ設定)を作成しているとき、activeadminのcss(たぶんjsも)が読み込まれなくて困った
起きたことと解決法
The asset "active_admin.css" is not present in the asset pipeline.
- 原因:
assets:precompile
を忘れていた - 解決法:
assets:precompile
を実行- ECSなのでDockerfileに
RUN DB_ADAPTER=nulldb bundle exec rails assets:precompile
を追加
- ECSなのでDockerfileに
ActionController::RoutingError (No route matches [GET] "/assets/admin/active_admin-●●.css
- 原因:まだ理解しきってないので書けません
- 解決法:config/enviroments/staging.rbの
config.public_file_server.enabled
をtrueに変更- なぜpublicがassetsに関係するのかと思ったら、プリコンパイルされたファイルは
public/assets
に置かれるらしいです
- なぜpublicがassetsに関係するのかと思ったら、プリコンパイルされたファイルは
【Rails】activeadmin アクションボタンを消す方法
やりたいこと
これらを出さないようにする
やり方
ActiveAdmin.register AdminUser do config.clear_action_items! # ←これを追加 end
追記:特定のアクションだけ消す・残す方法
- 一覧、詳細画面だけ表示
ActiveAdmin.register AdminUser do actions :index, :show end
- 編集画面、更新・削除権限なし
ActiveAdmin.register AdminUser do actions :all, except: [:edit, :update, :destroy] end
参考文献
https://stackoverflow.com/questions/7815319/activeadmin-disabling-the-new-resource-method