Railsメモ

独自定数を定義する

発環境ごとに定数を管理できるconfig(旧:rails_config )を利用する。

Gemfileに追記

gem 'config'

インストール

bundle install --path vendor/bundle
bundle exec rails g config:install

定数の記述例) config/settings/development.yml

test:
  val1: "TEST_VAL1"

利用例)

Settings.test[:val1]


数値編集

カンマ編集

<%= number_with_delimiter(123456789) %>   # => 123,456,789

表示桁数の指定

<%= number_with_precision( 12.345, precision: 2 ) %> #=> 12.35

通貨

<%= number_to_currency( 1234.5 ) %>    # => 1,235円 ※ロケール:ja の場合

※ config/locales/ja.yml を編集する事で ¥1,235 のように表示する事も可能。
 (number -> currency -> format 配下の format と unit )


テキスト編集

文字列の切り捨て

<%= truncate("桁数や文言を指定して切り捨てます。オプションには : length、: separator、: omission が指定できます。", :length => 10) %>
<!-- 結果:「桁数や文言を指...」-->

<%= truncate("桁数や文言を指定して切り捨てます。オプションには : length、: separator、: omission が指定できます。", :length => 50, :separator => "。") %>
<!-- 結果:「桁数や文言を指定して切り捨てます...」-->

オプション

オプション説明
:length切り捨てる桁数。(デフォルト:30)
:separator切り捨てる箇所を表す文字列
:omission切り捨て時に末尾に付与する文字列(デフォルト:...)

ハイライト表示

<%= highlight('このヘルパー(highlight)は指定文字列をハイライト表示します', "highlight") %>
<!-- 結果:「このヘルパー(<mark>highlight</mark>)は指定文字列をハイライト表示します」-->

<%= highlight('このヘルパー(highlight)は指定文字列をハイライト表示します', "highlight", :highlighter => '<span style="color:#f00;">\1</span>') %>
<!-- 結果:「このヘルパー(<span style="color:#f00;">highlight</span>)は指定文字列をハイライト表示します」-->

HTMLエスケープを抑制する

<%= "<a href='#test'>test link</a>" %>                       <!-- 結果:&lt;a href='#test'&gt;test link&lt;/a&gt;   -->
<%= raw("<a href='#test'>test link</a>") %>               <!-- 結果:<a href='#test'>test link</a>  -->
<%= "<a href='#test'>test link</a>".to_s.html_safe %>       <!-- 結果:<a href='#test'>test link</a>  -->

※ html_safe は nil の場合にエラーになるので、必ず to_s してから html_safe する方が良い。


メッセージの国際化対応

config/application.rb を編集

config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]     # config/locales 配下のファイルを全て読み込む
config.i18n.default_locale = :ja

config/locales 配下に定義ファイルを作成する

例)

config
   locales
     en.yml
     ja.yml
     messages
        en.yml
        ja.yml

正しく定義されているか確認

rails console
> YAML.load_file(Rails.root.join("config/locales/ja.yml"))


バリデータのメッセージを国際化対応する

application.rb を編集(application.rbの編集)したうえで、以下を実施。

対象の言語のメッセージ定義ファイルを取得する

https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale

元(英語)の定義ファイルの内容が漏れ無く定義されているか確認 ※念のため

https://github.com/rails/rails/blob/master/activemodel/lib/active_model/locale/en.yml
https://github.com/rails/rails/blob/master/activesupport/lib/active_support/locale/en.yml

取得したファイルを config/locales 配下に置く

config
   locales
     en.yml
     ja.yml


モデルの項目の日本語名を定義する

application.rb を編集(application.rbの編集)したうえで、以下を実施。

例) config/locales/models/モデル名/ja.yml

ja:
  listing_book: "本の一覧"
  editing_book: "本の編集"
  activerecord:
  #mongoid:                  # mongoid を使用している場合
    models:
      book: "本"
    attributes:
      book:
        isbn: "ISBN"
        title: "タイトル"
        price: "値段"

例) view/モデル名/index.html.erb

<h1><%= t(:listing_book) %></h1>
  ・
  ・
<table>
  <thead>
    <tr>
      <th><%= Book.human_attribute_name(:isbn) %></th>
      <th><%= Book.human_attribute_name(:title) %></th>
      <th><%= Book.human_attribute_name(:price) %></th>
      <th colspan="3"></th>
    </tr>
  </thead>
  ・
  ・

例) view/モデル名/edit.html.erb

<h1><%= t(:editing_book) %></h1>

<%= render 'form' %>

<%= link_to 'Show', @book %> |
<%= link_to 'Back', books_path %>


ロケールを動的に切り替える(コントローラ等で)

I18n.locale = :ja


コントローラでチェック処理を行う

flash[:alert] = "XXしてください"
redirect_to :back
return

または

redirect_to :back, alert: 'XXしてください'
return


モデルのバリデーション定義

必須入力チェック(presence)

validates :name, :email, presence: true

空値チェック(absence)

validates :login, absence: true

数値チェック(numericality)

validates :price, numericality: true
validates :price, numericality: { only_integer: true }   # 整数のみの場合

※ greater_than、greater_than_or_equal_to、equal_to、less_than、less_than_or_equal_to 等のオプションも使用可能。
※ message にはプレースホルダとして %{count} が使用可能。

正規表現チェック(format)

validates :legacy_code, format: { with: /\A[a-zA-Z]+\z/,  message: "英文字で入力して下さい" }

長さチェック(length)

validates :name, length: { minimum: 2 }
validates :bio, length: { maximum: 500 }
validates :password, length: { in: 6..20 }
validates :registration_number, length: { is: 6 }
validates :bio, length: { maximum: 1000,  too_long: "最大%{count}文字まで使用できます" }

※エラーメッセージは :wrong_length、:too_long、:too_short オプションを指定してカスタマイズ可能。

含有チェック(inclusion)

validates :size, inclusion: { in: %w(small medium large),  message: "%{value} のサイズは無効です" }

一意チェック(uniqueness)

validates :name, uniqueness: true

バリデーション専用の別クラスでチェック(validates_with)

validates_with MyValidator

※ 後述(バリデーション専用クラスを使用する

バリデーションオプション

共通のオプションとして allow_nil、allow_blank、message、on が使用可能。

オプション説明
allow_nil値がnilの場合にバリデーションをスキップする
allow_blank値がblank?の場合にバリデーションをスキップする(nil、空文字も含まれる)
messageカスタムエラーメッセージを指定する
onバリデーション実行のタイミングを指定する


モデルのバリデーションをカスタマイズする

カスタムバリデートを利用する

validate :my_validate

def my_validate
  if name == "TEST"
    errors.add(:name, "「TEST」は指定できません")
  end
end

バリデーション専用クラスを使用する

validates_with を使用して別のバリデーション専用クラスで定義した内容でチェックする事が可能。

class MyValidator < ActiveModel::Validator
  def validate(record)
    if record.name == "TEST"
      record.errors[:base] << "「TEST」は指定できません"
    end
  end
end
 
class Book < ActiveRecord::Base
  validates_with MyValidator
end


モデルのチェック処理を呼び出す

@user.valid?(:create)


SQLを直接実行する

http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/DatabaseStatements.html

@books = ActiveRecord::Base.connection.select_all("select * from books")


coffeescript、scss を手動ビルドする

rake assets:precompile

※app/assets 配下の scss, coffee がコンパイル/minifyされ、public/assets 配下に配置される


古いassetの削除(3世代分は残る?)

rake assets:clean


古いassetの削除(完全)

rake assets:clobber


assets のパスを確認する

rails console
> Rails.application.config.assets.paths


テンプレートをカスタマイズする

以下のコマンドでテンプレートのコピーをプロジェクト(lib/template)配下に作成する

rake rails:templates:copy

あとは作成されたテンプレートを編集するだけ。

ジェネレータを作成する

ジェネレータを使用してジェネレータを作成

rails generate generator modelyml
      create  lib/generators/modelyml
      create  lib/generators/modelyml/modelyml_generator.rb
      create  lib/generators/modelyml/USAGE
      create  lib/generators/modelyml/templates
      invoke  test_unit
      create    test/lib/generators/modelyml_generator_test.rb

ジェネレータのソースを編集

例としてモデルの列名をYMLに定義するジェネレータを作成してみる

lib/generators/modelyml/modelyml_generator.rb

class ModelymlGenerator < Rails::Generators::NamedBase
  source_root File.expand_path('../templates', __FILE__)

  # 定義したメソッドが上から順番に実行される
  def makeyml

    #@name ... 1つ目の引数
    #@args ... 2つ目以降の引数

    model = Module.const_get(@name.classify)
    fields = model.fields

    yml = ""
    #yml += "ja:\n"
    #yml += "  " + "activerecord:\n"   # orm が activerecord の場合
    yml += "  mongoid:\n"       # orm が mongoid の場合
    yml += "    " + "models:\n"
    yml += "      " + model.name.downcase + ": \"" + model.name.downcase + "\"\n"
    yml += "    " + "attributes:\n"
    yml += "      " + model.name.downcase + ":\n"
    fields.each_key do | key |
      yml += "        " + key + ": " + "\"" + key + "\"\n"
    end 

    create_file("config/locales/models/" + model.name.downcase + "/en.yml", "en:\n" + yml)
    create_file("config/locales/models/" + model.name.downcase + "/ja.yml", "ja:\n" + yml)

  end 

end

作成したジェネレータを実行

rails g modelyml book
      create  config/locales/models/book/en.yml
      create  config/locales/models/book/ja.yml


Scaffoldをカスタマイズする

RailsでScaffoldの実行内容をカスタマイズする


YMLを読み込む

yml_data = YAML.load_file(Rails.root.join("config/locales/ja.yml"))


turbolinks使用時に各ページの初期処理を定義するには

turbolinks を使用しているとページ遷移しても 全体は読み込まれない(body配下だけ書き換えられる)為、onloadイベントやjquery の ready イベント等は発生せず、page:load イベントが発火する。
・・が、page:load だけでは、どのページが読み込まれたかは判断できない為、ページ毎に初期化イベントをハンドリングする為に、少し手を加える。

views/layout/application.html.erb

 ・
 ・
<body id="<%= controller_name %>-<%= action_name %>">
 ・
 ・

assets/javascripts/_common.coffee ※jsのload順を調整する為に、共通系のjsは _(アンダーバー)で始まるファイル名にしておく等の考慮が必要

pageInit = ->
    id = $("body").attr("id");
    $("#"+id).trigger("pageinit");

$(document).ready(pageInit)
$(document).on("page:load", pageInit)

assets/javascripts/books.coffee

###
初期表示(一覧) 
###
pageInitIndex = (e) ->
    console.info "books init pageinit!"

###
初期表示(詳細) 
###
pageInitEdit = (e) ->
    console.info "books edit pageinit!"

# ページ読込時(一覧)
$(document).on "pageinit", "#books-index", pageInitIndex

# ページ読込時(詳細)
$(document).on "pageinit", "#books-edit", pageInitEdit


ブレークポイントの設定

TODO: pry-byebug2



トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-05-22 (日) 04:46:32 (3118d)