ztbuz@dev

人生に絶望しているZが、それでも技術を身につけようと必死になるブログ

Ruby on Railsでサンプルデータを登録するRakeタスクの作成方法

Ruby on Railsでのデータベースへの登録には、大きく分けて次の2つがあるのかな、と思います。

  1. 動作に必須となる初期データ
  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感は否めませんが、目的は十分に果たせます。

f:id:ztbuz:20131231204756p:plain

その他のクライアント

その他にもLitaも使ってみました。 ただ、これはrails consoleSQLite Database Browserで確認した値と異なる結果が表示されるなど、ちょっと使えるレベルではありませんでした。

MacのSQLiteGUIクライアントは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など)を参照しない方がいい、という考えを見かけました。

  • テンプレート(show.html.erb)がインスタンス変数を参照していないので、テンプレートを描画するためにコントローラで何を用意すべきか明らかでない
  • 部分テンプレート(_header.html.erb)がインスタンス変数を介して、呼び出し元のテンプレートだけでなくコントローラとも結びついているので、再利用性が低い

私もこの考えに同意できるので、できるだけ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: "&laquo; First"
      last: "Last &raquo;"
      previous: "&lsaquo; Prev"
      next: "Next &rsaquo;"
      truncate: "..."

おわりに

こんなに簡単にページングが実装できるなんて、便利な世の中になったものですね。。。