class CookingFoodstuff
include ActiveModel::Model
end
####include ActiveMedel::Modelとは
モジュールをincludeするのとクラスを継承する[クラスを引き継ぎたい=クラスの継承]
*車の設計図のような概念で、インスタンスを作るためにあるものがクラス
モデル名の調査/変換/翻訳/バリデーションが使えるようになります。
また、ActiveModel::Modelをincludeするクラスでは、Active Recordの場合と同様に
form_forやrenderなどのAction Viewヘルパーメソッドを使えるようになります。
(Active Model の基礎 - Rails ガイド)
####attr_accessorとは
まずアトリビュート 【attribute】 attr / 属性
アトリビュートとは、特性、特質、性質、~に要因を求める、~に帰する、などの意味を持つ英単語。ITの分野では対象の性質や設定などを示す付加情報などを指すことが多く、「属性」と訳される。
属性名 型
attribute :title, :string
attribute :body, :string
attribute :draft, :boolean, default: false
attribute :published_at, :datetime
attribute :tags
*tagは配列なので型はなし
####インスタンスメソッドattributes
「属性名 => 値」のハッシュが取り出せます
form.attributes
#=> {"title"=>"Foo", "body"=>"bar", "draft"=>false, "published_at"=>2019-12-15 15:40:00 +0900, "tags"=>["Ruby", "Rails"]}
####インスタンスメソッドまたはクラスメソッドのattribute_names
属性一覧が取り出せます(Rails 6で追加)。
form.attribute_names
#=> ["title", "body", "draft", "published_at", "tags"]
以上のことから
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :name
t.string :description
t.timestamps null: false
end
end
end
RubyはDBもなく、フレームワークでないただの言語なのでattributeはクラス内で
扱う(変数の)属性名(カラム名)とデータの型を決定している。
Railsではmigrationとしてデータの属性名、型、Nullの制約やデフォルト値を決めたりできます。
しかも事前に決めておき、保存前のバリデーション(保存情報の制約)を行う機能もありとても便利です。
#####インスタンスって何でしたっけ?
クラスから生成されたオブジェクトをインスタンスと呼びます。クラスとはなんだったでしょうか?クラスはいわばインスタンスを作るための型です。
p = User.new
newでインスタンス化されたオブジェクトは、厳密には無効データであってもエラーは出力されない。これは、createやsaveメソッドなどによってオブジェクトが保存されるときのみ、null:falseなどのバリデーションが実行されるためです。
User.new
=> #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil>
####あらためてattr_accessorとは
コンソールで以下を実行すると
class User
attr_accessor :name, :description
def print_upcase
puts name.upcase
end
end
user = User.new
=> #<User:0x007fb7f9bbd2b8>
user.name = "hassan"
=> "hassan"
user.description = "将来有望"
=> "将来有望"
user.name = true
=> true *更新も可能
user.name = 12
=> 12 *更新も可能
user.name = "hassan"
=> "hassan" *更新も可能
user.print_upcase
=> HASSAN
migrationみたいに事前に設定していいないのいで型は動的(可変)。
###attrは略語で元はattributeです。
attr_accessorで指定したフィールドはform_with内で使用できるフィールド名になります。