🙆

Rails6の学習・ビジュアルデザイン

2022/11/06に公開

ルーティングの設定

入れ子構造で作ることができる。

Rails.application.routes.draw do
  namespace :staff do
    root "top#index"
  end

  namespace :admin do
    root "top#index"
  end

  namespace :customer do
    root "top#index"
  end
end
  • root はブラウザがルートURLにアクセスした場合に、どのアクションが実行されるか指定するメソッド。シャープ記号の左側の top がコントローラー名、右側がアクション名。
  • top というコントローラー名に対応するクラスは通常 TopController だが、namespace内で定義されているため、 Staff::TopController というクラスを指すことになる。

コントローラーとアクションの作成

$ bin/rails g controller staff/top
class Staff::TopController < ApplicationController
  def index
    render action: "index"
  end
end

staff/top でコントローラーをジェネレートしたので、クラスは↑で述べたようにStaff::TopController となっている。

  • Rails用語のアクションとは、コントローラークラスのpublicなインスタンスメソッドを指す。
  • render は HTML を生成するメソッド
  • ERBテンプレートはapp/viewsディレクトリにコントローラーごとに分けて置き、ファイル名はアクション名とする。
  • アクションの中で、一度もブラウザに返すメソッド(render、redirect_to、send_file、respond_with)が呼ばれなかった場合、そのアクションに対応するERBテンプレートでHTMLが返される。つまり省略が可能になる。
  def index
  end

これでもHTMLが返る。

ERBテンプレートで文字列のエスケープ処理

セキュリティの都合上、HTML特殊文字をページに表示してもエスケープ処理がされる。エスケープしたくない場合は ActiveSupport::SafeBuffer クラスを利用する。このクラスはStringクラスを継承している。

<%= @fragment.html_safe %>
<%= raw(@fragment) %>

ヘルパーメソッド

ERBの中で使用できるメソッドをヘルパーメソッドと呼ぶ。 app/helpers/application_helper.rb で、ApplicationHelper モジュールのメソッドとして定義すれば、それがヘルパーメソッドとなる。

module ApplicationHelper
  def document_title
    if @title.present?
      "#{@title} - hoge"
    else
      "hoge"
    end
  end
end

present? はRailsの拡張クラス。blank?の否定。

レイアウトで利用すると。

<!DOCTYPE html>
<html>
  <head>
    <title><%= document_title %></title>
...

document_title と変数っぽいが、これはメソッド呼び出し。

アセットのプリコンパイル

productionモードではRailsアプリケーションが画像ファイル、JSファイル、CSSファイルをブラウザに返さなくなる。これらはNginxなどのWebサーバーが取り扱う。

アセットプリコンパイル

$ bin/rails assets:precompile

ローカル環境でproductionモードを確認したい場合は、以下のコマンドを実行するとRailsがスタティックファイルも返すようになる。

$ export RAILS_SERVE_STATIC_FILES=1

Discussion