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 のように表示する事も可能。 テキスト編集 †文字列の切り捨て †<%= truncate("桁数や文言を指定して切り捨てます。オプションには : length、: separator、: omission が指定できます。", :length => 10) %>
<!-- 結果:「桁数や文言を指...」-->
<%= truncate("桁数や文言を指定して切り捨てます。オプションには : length、: separator、: omission が指定できます。", :length => 50, :separator => "。") %>
<!-- 結果:「桁数や文言を指定して切り捨てます...」-->
オプション
ハイライト表示 †<%= 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>" %> <!-- 結果:<a href='#test'>test link</a> -->
<%= 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 取得したファイルを 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 等のオプションも使用可能。 正規表現チェック(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 が使用可能。
モデルのバリデーションをカスタマイズする †カスタムバリデートを利用する †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をカスタマイズする †YMLを読み込む †yml_data = YAML.load_file(Rails.root.join("config/locales/ja.yml"))
turbolinks使用時に各ページの初期処理を定義するには †turbolinks を使用しているとページ遷移しても 全体は読み込まれない(body配下だけ書き換えられる)為、onloadイベントやjquery の ready イベント等は発生せず、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
|