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
|