編集したファイル
I18n について
デザインについて
Lesson3までで、ごく基本的なページは出来上がって見た目もキレイにすることができます。
でも、それで終わりというわけにはいきません。
ログイン、検索、ドキュメント出力等々、アプリを作っているといろんな機能を追加したくなります。
これから、カッコいいアプリを作るためのコツを少しご紹介します。
何を隠そう、実はRailsと呼ばれるものは全部gemで出来ているんです!
gemの使い方
$ bundle install
あとはREADME、マニュアル等でごにょごにょ。。。
キビシしいようですが、gemの解説はここまでです。
gemはとてもたくさんあって使い方がそれぞれ全く違うので、ひとつひとつ説明することはできません。
ここでは、使い勝手のいいgemを紹介するだけにしますので、がんばってREADME等を読んで設定してみてください。
質問があればメーリングリストやレッスン中にどしどしご質問ください。
ここからは、Rubyのメソッドを使ってアプリの機能を実装していきます。
ちょっとプログラマぽくなってきました。
プログラミングが不安な人は、まずは必要なものだけ”設定”として覚えていけば大丈夫です。
ただ、本格的にメソッドを作っていくには基本的なRubyの知識が必要です。
少しずつ本や周りの人のコードから学んで力をつけましょう。
データベース内のデータの一貫性を守るための仕組みは、必要に応じて自分で追加しなければいけません。
Railsには便利で簡単な仕組みが用意されているのでおおいに活用しましょう。
このバリデーションは完全に”設定”だと思っても大丈夫です。
app/models以下の、対象データが入っているテーブルと同じ名前のファイル名.rbファイルに追記します。
例えば、
app/models/anime.rb
validates :name, uniqueness: true
これ以外にも、入力必須、文字数制限など、いろいろな機能がサポートされていますのでRails Guidesを参照ください。
次は、データベースからデータを取って操作をするときによく使うメソッドをご紹介します。
.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種類に分かれます。
Rubyのメソッドはdefで始まるメソッド名の宣言から記述しますが、クラスメソッドとインスタンスメソッドでは書き方がちょっと異なります。
クラスメソッド
def self.メソッド名
・・・
end
インスタンスメソッド
def メソッド名
・・・
end
クラスメソッドにはself.をつけないといけないので注意しましょう。
このあたりがよくわからないという方は、とりあえずdefでメソッドを作るのは後回しにして、
controllerが長くなってもいいので.where等で思ったデータを取れるようになることを目指してください。
自分でメソッドを作るのはその後でも遅くありません。
データの操作に関するメソッドは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) %>
他には、特定の文字だけ強調させたり、ひらがなをローマ字変換したり、電話番号の携帯・固定の振り分けなど、
表示に関するものは何でもアリですよ。
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 License
produced by Minami.rb