LoginSignup
0
0

More than 1 year has passed since last update.

ダイエット+食品管理アプリ構築の道程(3)

Last updated at Posted at 2021-06-25
FormObject
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"]

以上のことから

db/migrate/20160304060143_create_users.rb
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内で使用できるフィールド名になります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0