寝て起きて寝て

プログラミングが出来ない情報系のブログ

ruby on railsでActiveRecordの練習

目的

irb(interactive ruby)を使ってActiveRecordの操作をする

-環境

ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-linux] rails 4.2.3 rake 0.8.7

-準備

bundleの操作は省略

まずはrailsのプロジェクトを作成

bundle exec rails new test

ここからの操作は今作ったtestの中で行う

ここではデータベースやテーブルの作成を行う

bundle exec rails generate scaffold user name:string age:integer
bundle exec rake db:create
bundle exec rake db:migrate

-実行

irbを起動

bundle exec rails console

出てきたコンソールに

@user=User.new
@user.name="test_user"
@user.age="34"
@user.save

これでモデルクラスのオブジェクトを作成し、そのオブジェクトに対してsaveする

使いやすいわかりやすい ちなみに Rails3からArelを使ったやり方が推奨されてる

findは非推奨

バリデーションを使う

validatesはオプションを付けて入力のチェックをする事ができるもの

記入場所は./app/models/user.rb

validates :name, :presence=>true,
              :length =>{:minimum=>1,:maximum=>254}
    validates :age, :presence =>true, :on => :create

これで名前が1文字以上254以下かどうかをチェックする

またpresence=>trueで中身が入ってるかどうかの確認

:on :createで検証するタイミングをcreate時に設定

カスタムバリエーション

まず./app/models/にvalidatorsというディレクトリを作る。 ここに自分で作ったバリデーションを作成する

これを使うには ./config/application.rbを編集する

config.autoload_paths += Dir["#{config.root}/app/models/validators"]

という文を追加する

さらにuser.rb

class User < ActiveRecord::Base
    validates :name, :presence=>true,:ngword=>true,
              :length =>{:minimum=>1,:maximum=>254}
    validates :age, :presence =>true, :on => :create
end

と変更する(nameのところに:ngword=>trueで設定を有効化)

さらに./app/models/validatorsにngword_validator.rbを作成する

class NgwordValidator < ActiveModel::EachValidator
    #カスタムバリエーションメソッド
    def validate_each(record, attribute, value)
        ngword = ['hoge', 'ugo']
        if ngword.include?(value)
            record.errors[:attribute]<<'include ng word'
        end
    end
end

これによってnameにhoge,ugoが使用できなくなった

参考URL

www.atmarkit.co.jp