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が使用できなくなった