ruby: Ruby on Rails逆引きコマンド集

確認バージョン:

  • Rails: 7.0.3.1
  • Ruby: ruby 3.1.2p20 (2022-04-12 revision 4491bb740a)

開発環境操作

rake で利用するタスクを生成したい

bin/rails g task <namespace> <task_name>

例えば

bin/rails g task test_job test_task

./lib/tasks の下に test_job.rake が作成されている。
それ以降は Ruby on Rails での rake タスク作成の記事参照。

現在のenvironmentを確認する

以下のコマンドによって確認可能。

rails r "puts Rails.env"

テスト用サーバを外部公開したい

リモートで開発している際などで、bin/rails spuma を利用して稼働させたデバッグレベルのサーバを外から確認する必要があるとき。バインドするアドレスを変更する。

bin/rails s -b 0.0.0.0

ポートを変えたいときには -p もつける。以下の設定だと 3000 に公開。

bin/rails s -b 0.0.0.0 -p 3000

アプリケーションのタイムゾーンを設定する

アプリケーションで TimeZone付きの DateTime などをerb でそのまま表示した場合など、そこのタイムゾーン向けに計算しなおすか。

日本時間で表示したい場合には config/application.rb に以下を記述。

config.time_zone = "Tokyo

アプリケーションのロケールを日本語にしたい / 日本語を利用する方法

config/application.rb に以下を記述。これで ja で利用されていることをアプリケーション側が判別できる。

config.i18n.default_locale = :ja

後は、 config/locales/ja.yml というファイルを作成して対応する日本語訳を入れていく。

例えば kaminari であれば ドキュメントに記載されている YAML ファイルja.yml としてコピーして、日本語に変換してあげればよい。i18n対応しているアプリであれば、探せばlocaleファイルが存在しているはず。

UbuntuでバックエンドとしてPostgresを使うようにしたい

注意: SQLite3で動作させていた場合、この操作でデータが消えてしまうので必要な場合データ移行する。

まずもってドライバとPostgreSQLの本体が必要

sudo apt install libpq-dev postgresql

これにより postgres というユーザがLinux上に作成される。 PostgreSQLにアクセスできるのは postgres というユーザだけなので、まず切り替える。デフォルトパスワードがわからないので sudo su で切り替える。

sudo su postgres

アプリ向けのユーザ (postgresql上のユーザ) とデータベース作成

createuser <適当なユーザ名> -P
# DB作成、 development, test, production向けにそれぞれ作成
createdb <適当なDB名> -O <適当なユーザ名>
# 間違えたら下記コマンドでDatabase削除
dropdb <適当なDB名>

適当なユーザに対してDBの権限を付与。以下では適当なDB名を development、適当なユーザ名をmy_userとする。たぶんDBではなくPostgreSQLのサーバ全体での権限な気がする。

# psql development
psql (12.11 (Ubuntu 12.11-0ubuntu0.20.04.1))
Type "help" for help.

development=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 my_user   |                                                            | {}

development=# alter role "thats" with superuser
development-# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 my_user   |                                                            | {}

development=# alter role "my_user" with superuser;
ALTER ROLE
development=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 my_user   | Superuser                                                  | {}

PostgreSQLのコマンドは MySQL と大きく違うので以下参照。
https://qiita.com/aosho235/items/c657e2fcd15fa0647471

Gemfilegem 'sqlite3' が記述されていた個所を
gem 'pg' に変更する。

bundle install を実施してインストールする。

ここまでで接続準備ができたので、 config/database.yml を書き換えてRailsから接続できるようにする。

default: &default
  adapter: postgresql  # sqlite3から変更
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000
  encoding: unicode    # 追加
  username: my_user    # 作成したユーザを追加
  password: 'password' # 作成したユーザのパスワード
  host: localhost      # 接続先サーバのアドレス

development:
  <<: *default
  database: development# development向けDB名指定
  username: my_user          # 作成したユーザを追加
  password: 'password'       # 作成したユーザのパスワード
  host: localhost            # 接続先サーバのアドレス
  
# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: test             # test向けDB名指定
  username: my_user          # 作成したユーザを追加
  password: 'password'       # 作成したユーザのパスワード
  host: localhost            # 接続先サーバのアドレス
  
production:
  <<: *default
  database: production       # production向けDB名指定
  username: my_user          # 作成したユーザを追加
  password: 'password'       # 作成したユーザのパスワード
  host: localhost            # 接続先サーバのアドレス

これで接続できるはずなので一回 bin/rails s で起動させてアクセスしてみる。その時に Migrations are pending. 云々といったエラーが出ればOK。

最後に migration を実施。

bin/rails db:migrate

後は通常通り。

モデル操作関連

ここでは Model というモデルに対して操作を行うものとする。

ActiveRecord(データ)を検索したい

対象レコード(ActiveReocd, record)をカラム(column)の値から検索したい。対象オブジェクト(object)をメンバの値から検索したい。

find_by を利用する。ハッシュ形式で検索対象を入れる。

Model.find_by(name: 'hoge')

ActiveRecord(データ)を範囲検索したい / 絞り込みたい

対象レコード(ActiveReocd, record)をカラム(column)の値から範囲で検索したい。対象オブジェクト(object)をメンバの値の範囲から検索したい。

where を利用する。ハッシュ形式で検索対象を入れる。

Model.where(id: 1..45)

XX 以下、といった場合の指定は次の通り。不等号とはてなを使う。

# 今より前
Model.where('created_at < ?', Time.zone.now)

ActiveRecordの並び替えをしたい

他の言い方: 順序(order)を入れ替えたい、ソート(sort)したい
allwhere によって見つけたレコードを並び替えたい。

Model.all.order(:name)
# 昇順 (省略時と同じ動作)
Model.all.order(name: :asc)
# 降順
Model.all.order(name: :desc)
# 文字列指定、シンボルをスペース区切りで並べて書く形
Model.all.order("name ASC")

CSVからデータベースにRecordを格納したい

Recordを格納したいモデルのフィールドと同名のヘッダ情報が1行目に書かれているようなCSVを準備する。例えば nameage をもつ Person というモデルのRecordを格納したい場合、適当な名前 (例えば data.csv とする) で以下のようなCSVファイルを作成。

name,age
John,45
Ben,34

そして、 bin/rails console を実施してRailsのコンソールに入り以下。

require 'csv'    

CSV.foreach('data.csv', headers: true) do |row|
  Person.create!(row.to_hash)
end

参考: https://stackoverflow.com/a/10421696

development, production, test などの切り替え

環境変数により設定されている。そのため、 .bashrc などに記述をしておくのが良いか。

export RAILS_ENV=production

同一マシン上で切り替えるだけであれば問題ないが、環境も移行する時には config/master.key を手動でコピーしてくるのを忘れずに。gitで管理されない上に、ファイルが存在しないとRailsが動作できなくなる。

あと、 リバースプロキシでアクセスする場合、 public/ 以下を外部からアクセス可能にする必要がある。
また、asset pipelineのコンパイルをする必要がある。

bundle exec rails assets:precompile

それから、staticファイルをうちのサーバから見せますよ、という設定を行う必要がある。普通は外部ストレージにおいてあるからね。これも .bashrc に記述かな。
外部ストレージの場合は知らないが、追加で設定がいるだろう。

export RAILS_SERVE_STATIC_FILES=true

View関連

CSSファイルを外部から読み出す設定の方法

app/assets/stylesheets の中に CSSファイルを配置し、<%= stylesheet_link_tag "<ファイル名>" %> によって読み出す。

例えば

  • app/assets/stylesheets/application.css というファイルを作成 (たぶんデフォルトである)
  • layoutの中に <%= stylesheet_link_tag "application" %> と記述

Paginationしたい / 数が多いので分割して表示したい

選択肢は色々あるが、ここでは kaminari を利用する場合。

Gemfile に以下を記述

gem 'kaminari', require: true

インストール実施

bundle install

Recordの取り出し部分でPaginationを考慮するように修正。対象となるModelを動かしているController の記述を例えば以下のようにする。 page 関数の利用と、その引数に params[:page] が入ることが重要。

class ModelsController < ApplicationController
  def index
    @models= Model.all.page params[:page]
  end
end

対象の Viewファイルに以下を記述してページ送り部分記述。

<% @models.each do |model| %>
      <%= model.name%>
<% end %>
<%= paginate @models, window: 2 %> <!-- ← これね -->

これ以上の詳しい設定は kaminari のページ参照。

番外編: Kaminariを使うと変なスペースが導入される

Kaminariで上記の通りにPaginationを導入してみたところ、各数字の後に変なスペースが入ってしまい、きれいにセンタリングができなくなってしまっている。

調べたところ span の後に改行コードが導入されているせいで変なスペースが入ってしまう。これを削除する方法は以下。

<%= paginate(@models, window: 2).delete("\n")..gsub(/  /, '').html_safe %>

delete で改行コードを削除し、そのあと偶数個のスペースが挟まれているせいで同じことが起きるので gsub を利用して削除、そして html_safe をつけることでHTMLとしてレンダーする。

DateTime を任意の文字列形式で表示したい

config/initializers/time_formats.rb というファイルを作成して、そこに任意の表示したい形式を定義する。

Time::DATE_FORMATS[:ja] = "%Y年%m月%d日 %H時%M分"

View上で、to_s() という関数の引数に上記で定義した DATE_FORMATS の引数を入れて呼び出す。上の例でいうと :ja

<%= model.created_at.to_s :ja %>

現在のroutes を一覧表示

bin/rails routes

お問い合わせフォームを作成したい

お問い合わせフォームを検索すると、なぜだかDBにデータを突っ込むタイプの実装方法ばかりが出てくるがDBに入れてまで管理する気はしていないというあなたへ。

ここを見てください。
https://stackoverflow.com/a/58572544

コメント

このブログの人気の投稿

gnuplot: グラフの色を変更する

[Linux] rsyncで進捗を確認する

gnuplotで縦線を引きたい