Ruby on Railsでサンプルデータを登録するRakeタスクの作成方法
Ruby on Railsでのデータベースへの登録には、大きく分けて次の2つがあるのかな、と思います。
- 動作に必須となる初期データ
- 動作を確認するためのサンプルデータ
1に関してはseeds.rb
で行ない、2に関してはRakeタスクでやると、管理しやすいのかな〜と思っています。
ここでは、2のRakeタスクの方法についてメモします。
Rakeタスクを作成する方法
ファイルを準備する
Rakeタスクは、lib/tasks/foo.rake
として作成します。
手動でもよいし、以下の方法でも作成できます。
$ rails g task foo
Rakeタスクを書く
以下は、50人のサンプルユーザを登録するやつです。
namespace :db do
desc 'サンプルデータを登録する'
task populate: :environment do
50.times do |n|
User.create(
name: "ユーザ#{n}",
email: "user-#{n}@example.com",
password: 'test',
password_confirmation: 'test'
)
end
end
end
:environment
は、モデルにアクセスするために必須な、重要な部分なので、忘れないように書きます。
実行する
とりあえず実行してみます。
古いデータはdb:reset
で削除します。
$ bundle exec rake db:reset
$ bundle exec rake db:populate
関数で分ける
処理を増やしていくと管理が大変になるので、関数で分けたりします。 上の例を関数で分けてみます。
namespace :db do
desc 'サンプルデータを登録する'
task populate: :environment do
make_users
end
end
def make_users
50.times do |n|
User.create(
name: "ユーザ#{n}",
email: "user-#{n}@example.com",
password: 'test',
password_confirmation: 'test'
)
end
end
Fakerでサンプルデータを登録する
上の例だとデータが味気ないので、本物っぽいいいデータを登録したくなります。 FakerというGemがこれを実現します。
使い方は以下に詳しいです。
インストール
いつもどおり、Gemfile
に書いてbundle install
するだけです。
gem 'faker'
本物っぽい名前を生成する
以下のように、Faker::Name.name
で本物っぽい名前を生成してくれます。
日本語にローカライズしていれば日本人名も生成してくれます。
def make_users
50.times do |n|
User.create(
name: Faker::Name.name,
email: "user-#{n}@example.com",
password: 'test',
password_confirmation: 'test'
)
end
end
おわりに
これで、ポチポチサンプルデータを作らなくてもよくなりました。 たとえばページングの確認にも使えます。
たぶんこれが年末最後の更新となりますが、明日以降も引き続き学習を頑張ります。。。
MacでRuby on RailsのSQLiteを確認するGUIクライアント
表題の件に関するメモです。 いくつかフリーソフトを試したのですが、いちばん使いやすかったのはSQLite Database Browserでした。
SQLite Database Browser
SQLite Database Browserは、以下のような、データベースの確認に必要な最低限の機能がつかえます。
- テーブルの構造の確認
- データの内容の確認
- SQLの実行
前時代的なUI感は否めませんが、目的は十分に果たせます。
その他のクライアント
その他にもLitaも使ってみました。
ただ、これはrails console
やSQLite Database Browserで確認した値と異なる結果が表示されるなど、ちょっと使えるレベルではありませんでした。
MacのSQLiteのGUIクライアントはSQLite Database Browser一択かな〜、という感じでした。 おしまい。
Ruby on RailsのViewでPartialを使う方法
RailsのPartialの使い方についてです。 Partialとはビューで部分的にテンプレートを適用する、アレです。
Partialの使い方
テンプレートを呼ぶ
たとえば_foo.html.erb
というテンプレートを呼ぶ場合、以下のように書きます。
<%= render partial: 'foo' %>
テンプレートに値を渡す
上記に加えて、テンプレートに値を渡す場合、以下のように書きます。
以下は、foo
という変数を渡す場合の例です。
<%= render partial: 'foo', locals: { foo: 'foo' } %>
テンプレートからのインスタンス変数の参照について
テンプレートからは、インスタンス変数(@users
など)を参照しない方がいい、という考えを見かけました。
私もこの考えに同意できるので、できるだけlocals: { ... }
で値を渡すようにしようと思います。
おわりに
今日は記事を書きすぎて、書いてる途中タイポがだいぶ多くなりました。。。
Ruby on RailsでView間で値を受け渡す方法
簡単なメモですが、忘れないように。。。 View間で値を受け渡す方法についてまとめました。
View間で値を受け渡す方法
渡す側:provide / content_for
以下の2つの方法で、値を渡すことができます。 基本的に使い方は同じです。
<% provide :foo, 'foo' %>
<% content_for :foo do %>
foo
<% end %>
これらは繰り返し書くことによって値をスタックすることもできます。
content_for
の方は、flush
オプションでスタックを削除したりできるので、込み入った使い方をしたい場合はこちらかもしれません(適当)。
<% content_for :foo do %>
foo
<% end %>
# => "foo"
<% content_for :foo do %>
bar
<% end %>
# => "foo bar"
<% content_for :foo, flush: true do %>
baz
<% end %>
# => "baz"
受ける側:yield
これはyield
を書くだけです。
<%= yield :foo %>
おわりに
おわりです。
Ruby on Railsで各ページのタイトルを設定する方法
Ruby on Railsで各ページのタイトルをどう設定すればよいのか悩みました。 いろんな記事を見ても、メンテナンス性の観点からどうもしっくり来ず。。。 なので、自分なりの設定方法を考えてみました。
私はエンジニアとして活動している訳ではないので、エンジニアの知り合いもおらず、どの方法がベストプラクティスか分かりません。 よければご教示ください。。。
設定方法
各ページのタイトルの設定
各ページのタイトルはconfig/locales/ja.yml
に以下のように設定します。
ja:
title:
base: 'サイト名'
sessions:
new: 'ログイン'
users:
index: 'ユーザ一覧'
show: 'プロフィール'
new: 'アカウント作成'
edit: 'アカウント編集'
ビューから呼び出すためのヘルパー
app/helpers/application_helper.rb
に、以下のようにタイトルを設定する関数を書きます。
def title
@page_title = t("title.#{controller.controller_name}.#{controller.action_name}", default: '') if @page_title.nil?
if @page_title.empty?
t('title.base')
else
@page_title + ' | ' + t('title.base')
end
end
def title_variable(title)
@page_title = title
end
ビューでタイトルを表示する
app/views/layouts/application.html.erb
で以下のようにシンプルに呼び出します。
<title><%= title %></title>
動的なタイトルを設定する
プロフィールページで「○○さんのプロフィール」など、値に応じて異なるタイトルにする場合は、以下のように各ビューにタイトルを埋め込みます。
たとえば、以下はapp/views/users/show.html.erb
の例です。
<% title_variable "#{@user.name}さんのプロフィール" %>
おわりに
よく見られるprovide/yield
を用いた方法や、t ('.title')
を用いた方法なども試したのですが、上記の方法の方がよいのかな? と思いました。
他によい方法をご存知の方、ぜひぜひコメントなどお願いします!
Ruby on Railsの日本語へのローカライズの方法
kaminari
の設定をしていたらローカライズについて出てきたので、すこし調べてみました。
ローカライズの方法
日本語の設定
まず、config/application.rb
を編集して、日本語を有効にします。
デフォルトでは、以下のような記述があります。
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
# config.i18n.default_locale = :de
この一番下をコメントアウトし、以下のように:ja
を設定します。
config.i18n.default_locale = :ja
これだけで設定は完了です。
ラベルの設定
ラベル自体は、config/locales/ja.yml
に設定します。
たとえば、以下のような感じです。
ja:
foo: 'ふー'
bar:
baz: 'ばず'
ビューでの呼び出し
ビューから呼び出すには、以下のように記述します。
<%= t('foo') %>
<%= t('bar.baz') %>
コントローラでの呼び出し
コントローラからは、以下のようにI18n.t()
で呼び出します。
I18n.t('foo')
I18n.t('bar.baz')
おわりに
他にも、データベースのカラムに対応させたり、JavaScriptに用いるなど、いろんな応用ができるらしいです。 これについては、実際に使うことになったら改めて学びます。。。
Ruby on Railsでkaminariでページネーションを実装する方法
Railsチュートリアルにはページネーションにwill_paginate
を使っていたのですが、私はよく聞くkaminari
を使ってみたので、その使い方をまとめてみます。
ちなみにこの記事より公式ドキュメントの方が役に立ちます。。。
基本的な使い方
インストール
まず、Gemfile
に書きます。
gem 'kaminari'
あとはbundle install
するだけです。
$ bundle install
コントローラ
ページを表示するコントローラの部分で以下のように書きます。
def index
@users = User.page(params[:page])
# 1ページあたりの表示数を指定する場合
# @users = User.page(params[:page]).per(10)
end
ビュー
あとは当該ビューで以下のように表示させます。 簡単!
<%= paginate @users %>
応用
ビューのカスタマイズ
以下のコマンドでapp/views/kaminari/
以下にビューファイルが生成されるので、それをよしなに編集します。
$ rails g kaminari:views default
設定のカスタマイズ
以下のコマンドで、config/initializers/kaminari_config.rb
が生成されます。
$ rails g kaminari:config
この中は以下のようになっており、適宜編集します。
Kaminari.configure do |config|
# config.default_per_page = 25
# config.max_per_page = nil
# config.window = 4
# config.outer_window = 0
# config.left = 0
# config.right = 0
# config.page_method_name = :page
# config.param_name = :page
end
ローカライズ
config/locale/ja.yml
に、以下のようにしてラベルを変更できます。
もちろんRails自体のローカライズは設定済みの前提です。
ja:
views:
pagination:
first: "« First"
last: "Last »"
previous: "‹ Prev"
next: "Next ›"
truncate: "..."
おわりに
こんなに簡単にページングが実装できるなんて、便利な世の中になったものですね。。。