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 s
で puma
を利用して稼働させたデバッグレベルのサーバを外から確認する必要があるとき。バインドするアドレスを変更する。
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
Gemfile
の gem '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)したい
all
や where
によって見つけたレコードを並び替えたい。
Model.all.order(:name)
# 昇順 (省略時と同じ動作)
Model.all.order(name: :asc)
# 降順
Model.all.order(name: :desc)
# 文字列指定、シンボルをスペース区切りで並べて書く形
Model.all.order("name ASC")
CSVからデータベースにRecordを格納したい
Recordを格納したいモデルのフィールドと同名のヘッダ情報が1行目に書かれているようなCSVを準備する。例えば name
と age
をもつ 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
コメント
コメントを投稿