Lesson4


Lesson3の復習

編集したファイル

I18n について

デザインについて


カスタマイズに向けての第一歩

Lesson3までで、ごく基本的なページは出来上がって見た目もキレイにすることができます。
でも、それで終わりというわけにはいきません。
ログイン、検索、ドキュメント出力等々、アプリを作っているといろんな機能を追加したくなります。
これから、カッコいいアプリを作るためのコツを少しご紹介します。


便利ツール:gemを使う

gemとは
Rubyで書かれたある機能をパッケージ化して機能拡張のために配布されているもの

RubyGems.orgにあるものは自由にダウンロードして使ってもいいですが、ライセンスはgem毎に異なるのでご注意ください。
または、The Ruby Toolboxに、機能毎のgemがずらりと並んであるので、そちらで調べて使ってみるのもいいかもしれません。

何を隠そう、実はRailsと呼ばれるものは全部gemで出来ているんです!

gemの使い方

  1. Gemfileにgemを追記
  2. コマンド実行
$ bundle install

あとはREADME、マニュアル等でごにょごにょ。。。

キビシしいようですが、gemの解説はここまでです。
gemはとてもたくさんあって使い方がそれぞれ全く違うので、ひとつひとつ説明することはできません。
ここでは、使い勝手のいいgemを紹介するだけにしますので、がんばってREADME等を読んで設定してみてください。
質問があればメーリングリストやレッスン中にどしどしご質問ください。


ちょっとRubyに働いてもらう

ここからは、Rubyのメソッドを使ってアプリの機能を実装していきます。ちょっとプログラマぽくなってきました。
プログラミングが不安な人は、まずは必要なものだけ”設定”として覚えていけば大丈夫です。
ただ、本格的にメソッドを作っていくには基本的なRubyの知識が必要です。
少しずつ本や周りの人のコードから学んで力をつけましょう。


言語別役割分担とつながり

Rails and Languages


バリデーションを設定する

データベース内のデータの一貫性を守るための仕組みは、必要に応じて自分で追加しなければいけません。
Railsには便利で簡単な仕組みが用意されているのでおおいに活用しましょう。
このバリデーションは完全に”設定”だと思っても大丈夫です。
app/models以下の、対象データが入っているテーブルと同じ名前のファイル名.rbファイルに追記します。

例えば、

app/models/anime.rb

validates :name, uniqueness: true

これ以外にも、入力必須、文字数制限など、いろいろな機能がサポートされていますのでRails Guidesを参照ください。


よく使うメソッド

次は、データベースからデータを取って操作をするときによく使うメソッドをご紹介します。


.whereメソッドの書き方

.whereはホントによく使いますので、少し詳しく紹介します。

controllerに書く場合

例えば、app/controllers/animes_controller.rbのindexでは、

def index
  @animes = Anime.all
  ・・・
end

この@animesには、Animeテーブルの全てのデータが入っていますが、これを.whereでデータの絞り込みをしてみましょう。

ここで「現在放映中のアニメ(Anime.state == ‘active’)でかつ、始まった年の降順」のデータがほしいとき、

def index
  @animes = Anime.where(state: 'active').order("start_year DESC")
  ・・・
end

viewいじらずにこれだけでデータの内容と順番を変えることができます。


scopeとしてmodelに書く場合

このようなデータ操作をいろんなところで使う場合、操作内容が全く同じであればscopeとしてmodelsに登録しておくと、そのscopeを呼ぶだけで同じことができます。
そうすることでcontrollersの記述も短くなり、見た目もきれいになって読みやすくなります。
こういった同じ機能をまとめたり、コードを見やすくする工夫をリファクタリングと呼びます。

先ほどの「現在放映中のアニメ(Anime.state == ‘active’)」の部分をscopeにしてみましょう。
app/models/anime.rbへ以下のように追記します。

class Anime < ActiveRecord::Base
  ・・・
  scope :active, ->{where(state: 'active')}
  ・・・
end

scopeのうしろのコロンが付いた変数(シンボルと言います)は、scopeの名前(メソッド名)ですので、分かりやすい名前をつけましょう。
そのあとの{ }の中にデータ操作するメソッドを記入します。ここに.order等をつなげて入れても大丈夫です。

それから、controllerを編集します。

def index
  @animes = Anime.active.order("start_year DESC")
  ・・・
end

どうでしょう?ちょっと短くなって読みやすくなりましたか?
このように、データを集計・編集するようなメソッドはmodelに書くようにし、
controller内のコードが長くなりすぎないようにするというのが最近の流行のようです。


クラスメソッドとインスタンスメソッドについて

メソッドという言葉が何度も出てきていますが、大きく2種類に分かれます。

クラスメソッド
Rails内では、主にクラス(テーブル)のデータ全体にかかわるメソッド
例).new、.find、.whereなど
インスタンスメソッド
Rails内では、主にインスタンス(テーブル内の個別データ)にかかわるメソッド
例).map、.group_by、.sort_by、.gsubなど
ヘルパーメソッド
インスタンスメソッドの一種で、Rails固有のviewのサポートをするメソッド
直接データベースからデータを取るようなことはせず、controllerで取ったデータをviewで表示するために成形したり、よく使う定型データを取得したりすることを目的とします。

Rubyのメソッドはdefで始まるメソッド名の宣言から記述しますが、クラスメソッドとインスタンスメソッドでは書き方がちょっと異なります。

クラスメソッド

def self.メソッド名
  ・・・
end

例:(考え中)


インスタンスメソッド

def メソッド名
  ・・・
end

例:(考え中)

クラスメソッドにはself.をつけないといけないので注意しましょう。

このあたりがよくわからないという方は、とりあえずdefでメソッドを作るのは後回しにして、
controllerが長くなってもいいので.where等で思ったデータを取れるようになることを目指してください。
自分でメソッドを作るのはその後でも遅くありません。


viewで使うヘルパーメソッド

データの操作に関するメソッドはapp/modelsに記入しますが、ヘルパーメソッドは専用のapp/helpersに記入します。

例えば、アニメの一覧で放映中を’active’と表示せずに’○’で表示させたいとき、 app/helpers/anime_helper.rb

module AnimeHelper
  def convert_maru(state)
    if state == 'active'
      '○'
    end
  end
end

というconvert_maruというヘルパーメソッドを定義してviewで呼び出せばOK。

app/views/animes/show.html.erb

<%= convert_maru(anime.state) %>

他には、特定の文字だけ強調させたり、ひらがなをローマ字変換したり、電話番号の携帯・固定の振り分けなど、表示に関するものは何でもアリですよ。


ここまでできること


Lesson4はここまでです。おつかれさまでした

This work is licensed under a Creative Commons Attribution-Share Alike 3.0 License

produced by Minami.rb