emolog

脳内メモです。

はてぶのコードハイライトの色を変える

kerotaa.hateblo.jp

を参考に

# スニペットのカラーを変更
.entry-content pre.code {
    background-color: #002B36;
    color: #E0E2E4;
}
.synSpecial { color: #DC322F }
.synType { color: #B58900 }
.synComment { color: #7D8C93 }
.synPreProc { color: #B58900 }
.synIdentifier { color: #268BD2 }
.synConstant { color: #2AA198 }
.synStatement { color: #B58900 }
# フォントのサイズを変更
.entry-content { font-size: 15px }

にした。

【rails】データ移行を伴わないカラム名の変更をしたい

f:id:ababababa0222:20210308172835p:plain

やりたかったこと

  • 部屋テーブルに紐づくuser_idを、作成したユーザだとわかるようにowner_user_idに変更したい
    • データ移行は伴わない
  • 変更するカラム名は、テーブル名とことなるもの

やったこと

class ChangeUserToOwenerUser < ActiveRecord::Migration[6.0]
  def change
    remove_reference :rooms, :user, index: true
    add_reference :rooms, :owner_user, foreign_key: { to_table: :users }, after: :id, null: false
  end
end

【ruby】 aws cognitoのアドレスを変更する

cognitoつかっためも

前提

  • ruby: 2.6.3
  • aws-ruby-sdk: 3系
  • aws cognitoにで認証情報を管理している。
  • DBにもemailを主キーとしたusersテーブルが存在する。

f:id:ababababa0222:20210309174209p:plain

やりたいこと

  • cognito上のattributeを更新
    • emailを更新する
    • email_
  • DB上のemailを更新

雑にメモ

以下はcognitoのSDKのメソッド

# ドキュメントから引用
# usernameが必須なので無理そう
resp = client.admin_get_user({
  user_pool_id: "UserPoolIdType", # required
  username: "UsernameType", # required
})
# list_usersの引数のfilterにemailを指定して、where句みたいにする
client.list_users(
  user_pool_id: user_pool_id,
  filter: "email = \"#{email}\""
).users.first
client.admin_update_user_attributes({
  user_pool_id: "UserPoolIdType", # required
  username: "UsernameType", # required
  user_attributes: [ # required
    {
      name: "email", # 変更後のemail
      value: "changed_email",
    },
    {
      name: "email_verified", # emailが承認されているかどうか
      value: "true",
    },
  ],
  client_metadata: {
    "StringType" => "StringType",
  },
})

【rails】新規のrailsプロジェクトを作るときの手順メモ

何回やっても、よく忘れるのでメモです。

新規のrailsプロジェクトを作る

f:id:ababababa0222:20210308172306p:plain

前提

rails new hogeしない

  • システムのgemを使わない
  • bundle execで呼び出す
$ mkdir hoge
$ cd hoge
$ bundle init
  • Gemfile
# frozen_string_literal: true
source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "rails"
  • rbenvでlocalのrubyのバージョンを固定する
$ bundle install --path vendor/bundle
# APIを提供する薄いrails
$ bundle exec rails new . -B -d mysql --skip-turbolinks --skip-test --no-skip-webpack-install -J

オプションはこちら

emolog.hatenablog.com

参考

qiita.com

【rails】active_adminの詳細ページを変更する

f:id:ababababa0222:20210308172756p:plain

やりたいこと

  • active_adminで管理画面の詳細ページから、ユーザのメールアドレスを変更できるように修正したい

やったこと

  • /admin/users.rb の変更
ActiveAdmin.register User do
  actions :index, :show, :new, :create, :update, :edit

  permit_params :email, :team_id, :user_name,

  # email変更用のラベル
  CHANGE_EMAIL_LABEL = 'email (※ メールアドレスを変更する場合のみ変更してください)'

  form do |f|
    f.inputs do
      # 新規作成
      if f.object.new_record?
        f.input :team
        f.input :email
        f.input :user_name
      # 更新
      else
        li "team: #{f.object.team.name}"
        li "email: #{f.object.email}"
        li "user_name: #{f.object.user_name}"
        # ここを追加
        f.input :email, label: CHANGE_EMAIL_LABEL
      end
    end
    f.actions
  end

  controller do
    def update
      # ここにロジックを書く
      # user_modelのインスタンスメソッドを呼ぶイメージ
    end
  end

【rails】 seedデータ投入時に、csvをimportしてよしなにする

seed_data投入をいい感じにやりたかったので、メモ seeds.rbに全部入れるのは見通しが悪くなるのでやめたい。

f:id:ababababa0222:20210308172835p:plain

やりたいこと

  • csvファイルに、seed_data用のファイルを定義
  • そのファイルを読み込んでseed_dataとして投入
  • bundle exec rails db:seed で実行される

やったこと

  • dbディレクトリのseeds配下に元データとなる csv と実行する script ディレクトリを定義した
  • seeds.rbでscript配下のrubyファイルを実行するイメージ
├── migrate
├── schema.rb
├── seeds
│   ├── csv
│   └── script
└── seeds.rb
  • seeds.rb をseed配下のスクリプトを実行するように変更
    • ソートはファイル名で
    • データ投入の順序を制御したくなると思うので 01_user.rb みたいして、それで制御する
require "csv"

Dir[File.join(Rails.root, 'db', 'seeds', 'script', '*.rb')].sort.each do |seed|
  load seed
end

スクリプトを定義

  • db/seeds/script/01_user.rb
CSV.foreach('db/seeds/csv/01_user.csv', headers: true) do |row|
  Room.create!(
    name: row['name']
  )
end

データを定義

  • db/seeds/csv/01_user.csv
name
emono

これで bundle exec rails db:seed をするとデータが投入される

railsでfactory_botのセットアップ

やりたいこと

  • 新規プロジェクトでのfactory_botの整備をしたい
    • railsでモックのデータを作る

f:id:ababababa0222:20210308172835p:plain

やったこと

  • gemに追加
group :test do
  gem 'factory_bot_rails'
end
  • rails_helperに以下を追加
RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods
end

上述のコードを加えることで、以下のようにrspecのテストコード中でFactory_botのメソッドを使用する際に、クラス名の指定を省略できるようになる。

# 通常FactoryBotをつけないと、メソッドを呼べない
user = FactoryBot.create(:user)

# 上の設定を追加することで、FactoryBotの記述が省略できる。
user = create(:user)

FactoryBotのデータはspec/factories/xxxxx.rb みたいな形式

  • spec/factories/user.rb
FactoryBot.define do
  factory :user do
    name { "testuser1" }
  end
end