Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What is going on with this article?
@osamtimizer

railstutorial 第6章まとめ

More than 5 years have passed since last update.

モデルを作る

生成

前準備

Console
$rails g model User name:string email:string

これで必要なファイルが自動生成。

追記:
Rails3.2以降は属性の規定値がstringとなるため、省略可能となるようです。

console
$rails g model User name email

実際に作ってみる

user = User.new
user = User.new(name:"Sample", email:"example@test.com")

model生成直後はこんな感じで作れる。
でも実際は名前とか必須じゃないと困る。
ので、validation機構を追加。

Validation

User.rb
class User < ActiveRecord::Base
  validates :name, presence: true
  validates :email, presence: true, uniqueness: {case_sensitive: false }
end

このvalidation機構を追加すると、Userを作るときに名前の正当性、emailの一意性(大文字小文字を区別しない)の検証が可能となる。

Rails-console
user = User.new()
user.valid?
=>false
user.save
=>false
User.Create()
=>false

どころでValidationって何がいいの?

=>ActiveRecord経由でDBに保存や変更をしようとした時、vlaidationに失敗すると変更をキャンセルするようになっている。

いろんなvalidation

他にも存在性だけでなく、正規表現を使ったemailの正しい書式や、文字数のvalidationとかも行える。

user.rb
validates :email, presence: true, length: { maximum: 250 }, format: { with: /<regular expression>/ }

モデルのマイグレーション

Console
$rails g migration add_index_to_users_email

インデックスを追加してみる。

[timestamp]_add_index_to_users_email.rb
class AddIndexToUsersEmail < ActiveRecord::Migration
    def change
        add_index :users, :email, unique: true
    end
end

changeメソッドの中に何をするか書けば良い。
add_indexはインデックスを追加するメソッド。

console
$bundle exec rake db:migrate

マイグレーションを実行。

※マイグレーション:DBに保存されているデータを保持したまま、テーブルの作成やカラムの変更を行うこと。

テストあれこれ

普通のテスト

RailsのテストフレームワークはRSpecとかいろいろあるけど、とりあえず一番シンプルなやつを。

testfile.rb
test "should be valid" do
    @user = User.new(name:"Example User", email:"example@test.com")
    assert @user.valid?
end

ちなみにコントローラやモデルのテストは自動生成されている。
インテグレーションテストを作る場合には、railsコマンドを使用する。

console
$rails g integration_test <テスト名>

実行

console
$bundle exec rake test

コールバック

例えば、emailは保存前に小文字に変換しておきたいとする。

user.rb
before_save: { self.email = email.downcase }

と書くことで、user.saveをする前にemailを小文字に変換することができる。
この機構はコールバックを使っていて、無名関数を直書きししてもいいし、別のメソッドを割り当てても構わない。

user.rb
before_save :downcase_email

def downcase_email
    self.email = email.downcase
end

パスワード

下準備

bcryptのgemを追加。

Gemfile
gem 'bcrypt', '~>3.1.7'
console
$bundle install

あとは、modelにpassword_digest:stringという属性を追加した後に、has_secure_passwordというメソッドを追加するだけで良い。

まずはマイグレーション

console
$rails g migration add_password_digest_to_users password_digest:string
$bundle exec rake db:migrate

パスワードの実装

user.rb
class User < ActiveRecord::Base
    ...
    has_secure_password
end

こうすると、ハッシュ化されたパスワードをDB内のpassword_digestという属性に保存できるようになる。

さらに、Userモデルに対してpasswordpassword_confirmationが使えるようになる。

パスワードのテストとvalidation

このpasswordpassword_confirmation属性は強制的にvalidation機構が追加されているので、
初めて追加した時はテストには軒並み失敗するようになっている。

ので、テストのデータにはちゃんとpassword/confirmationを追加する。

user_test.rb
def setup
    @user = User.new(name:"example user",email:"example@test.com",
                     password:"foobar",password_confirmation:"foobar")
end 

さらにpasswordにはバリデーションも簡単に追加できる。

user.rb
validates :password, presence: true, length: { minimum: 6 }
2
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
pepabo
「いるだけで成長できる環境」を標榜し、エンジニアが楽しく開発できるWebサービス企業を目指しています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
2
Help us understand the problem. What is going on with this article?