scaffoldに頼らない明日のためにサイト構成をもっと工夫しろ
今度はコントローラとビューについてプロから熱い指導が入りました。
めちゃくちゃ勉強になった。
サイト構成とrailsの構成
今までscaffoldで作ってたので、特にサイトの構成とかなんも考えてなかったんだけど、普通、サイトって「トップページがあって、そこに各ページがあって、んで上下にはヘッダとフッタで挟まれて…」と考えるのが普通。
けど、にわかがいきなりscaffoldからはいっちゃったもんだから、scaffoldベースで考えてしまい、結果うんこなことに。
コナンもびっくりのあれれ〜状態。
まず、scaffoldは結構ブラックボックスのままナントカなっちゃうことが多いのでプロ的にはあんまりよろしくないとのこと。
まずはルートのコントローラとビュー作って、レイアウトのビュー作って、とやってく方が筋がいい、みたい。
とにかく、あれこれ作ったものは一旦おいといて、ページ構成を考える。
トップページのコントローラを作成、ルーティングさせる
- 別にオブジェクト扱わないからモデルとかもいらない。
- コントローラの作成。→ home_controller.rb
- 合わせてビューも作る。→ home/index.html.erb
- ルートを通す。
root 'home#index' # get '/' => 'home#index' と同義
トップページのレイアウトは通常レイアウトと異なるものを使ってみる
通常何もしないと、layouts/application.html.erbがレイアウトとして読み込まれる。
これに対して、コントローラやアクションごとに異なるレイアウトを利用したい場合は簡単にできる。
- まず、適用させたいレイアウトファイルをlayouts配下に作成(とりあえずapplication.html.erbのコピペとかでもOK)
- そのレイアウトを利用したいアクションの、コントローラ内にrenderメソッドを記述する。
- ↓みたいな。
# GET '/about' def about render layout: 'application2' end
こうすることで、個別のレイアウトを適用することができる。
ヘッダとフッタを部分テンプレートにする
例えば、フッタ部分を共通化させたいとき。
- ビューの記述を_footer.html.erbにまとめる。アンダーバーをつけることで部分テンプレートとすることができる。
- Railの作法として、部分テンプレートはどこからでも呼び出すことができる、らしいので、利用したいテンプレート内で呼び出す。
- partialオプションを使う(参照:render - リファレンス - - Railsドキュメント )
<%= render partial: 'layouts/footer' %>
※ コントローラから呼び出す場合と違い、パスはlayouts/から呼び出す必要あり。
トップページからanime_titleのビューを呼び出す
上の部分テンプレートの発展系。他のコントローラ配下にある部分テンプレートを呼び出す。
このとき、引数が必要な場合は、インスタンスも合わせてローカルに呼ぶ。(インスタンス定義は必要)
- home/indexでanime_titleの_highlightテンプレートを呼ぶ場合
[ home/index.html.erb ]
<%= render partial: 'anime_titles/highlight', locals: { anime_titles: @anime_titles } %>
[ home/controller.rb ]
def index @anime_titles = AnimeTitle.all end
めちゃくちゃ理解しました。ちょっとだけscaffoldから飛び出せたきがするよ
あと、まだここまで行けないけど、画像の保存については、 paperclip なるものをつかうとよいらしい。github.com