読者です 読者をやめる 読者になる 読者になる

Railsガイドメモ5

programming

2/13(火) 08:20

   今日は第4章から読む。
   読むだけではなく、実際にRails new で作ったアプリでコードを検証して進む。以下に、いつも通り、覚えておきたい部分をコピペする。


  • コントローラレベルのバリデーションは一度はやってみたくなるものですが、たい てい手に負えなくなり、テストも保守も困難になりがちです。アプリケーションの 寿命を永らえ、保守作業を苦痛なものにしないようにするためには、コントローラ のコード量は可能な限り減らすべきです。

  • Rails チームは、ほとんどの場合モデルレベルのバリデーションが最も適切であ ると考えています。

  • Active Record の new_record?インスタンスメソッドを使用して、オブジェ クトが既にデータベース上にあるかどうかを確認できます。

  • 以下のメソッドではバリデーションがトリガされ、オブジェクトが有効な場合にのみ データベースに保存されます。

    • create
    • create!
    • save
    • save!
    • update
    • update!
  • 4.1.3 バリデーションのスキップ 以下のメソッドはバリデーションを行わずにスキップします。オブジェクトの保存は、 有効無効にかかわらず行われます。これらのメソッドの使用には注意が必要です。

    • decrement!
    • decrement_counter
    • increment!
    • increment_counter
    • toggle!
    • touch
    • update_all
    • update_attribute
    • update_column
    • update_columns
    • update_counters
class Person < ActiveRecord::Base validates :name, presence: true
end
>> p = Person.new
# => #<Person id: nil, name: nil> >> p.errors.messages
# => {}
>> p.valid?
# => false
>> p.errors.messages
# => {name:["空欄にはできません"]}
>> p = Person.create
# => #<Person id: nil, name: nil> >> p.errors.messages
# => {name:["空欄にはできません"]} >> p.save
# => false
>> p.save!
# => ActiveRecord::RecordInvalid: Validation failed: 空 欄 に は で き ま せ ん >> Person.create!
# => ActiveRecord::RecordInvalid: Validation failed: 空 欄 に は で き ま せ ん
  • validates_associated は関連付けの両側のオブジェクトでは実行しない でください。関連付けの両側でこのヘルパーを使用すると無限ループになります。 validates_associated のデフォルトエラーメッセージは “is invalid” です。関連付 けられたオブジェクトにも自分の errors コレクションが含まれるので、エラーは呼び出 し元のモデルまでは伝わりません。

  • validates :email, confirmation: true ビューテンプレートで以下のようなフィールドを用意します。

<%= text_field :person , :email %>
<%= text_field :person , :email_confirmation %>
 

このチェックは、email_confirmation が nil でない場合のみ実施されます。


以下は本文からのコピペではない。

バリデーションヘルパ lengthのtokenizerオプションを使ったサンプルコードを書いたら以下のメッセージが出た。

DEPRECATION WARNING: The :tokenizer option is deprecated, and will be removed in Rails 5.1. You can achieve the same functionality by defining an instance method with the value that you want to validate the length of. For example,

validates_length_of :essay, minimum: 100,
  tokenizer: ->(str) { str.scan(/w+/) }

should be written as

validates_length_of :words_in_essay, minimum: 100

private

def words_in_essay
  essay.scan(/w+/)
end

手元で動かしてるRails は5.0.1 なので動いた。

  • record.errors[:base] に追加されるエラーは、概して特定の属性よりもそのレコード全体の状態に関係しているものです。

4.2 バリデーションヘルパーの1個1個、コードを書いて動かして確認した。 明日は 4.3 から