6章:モデル操作
開発環境でposgresqlでなく、sqliteを仕様する場合、「rails db:create」は実行しない。
※ローカル環境でpostgresqlを指定せず、herokuなどの本番環境のみpostgresqlを指定しているため。ActiveRecordの前に、sqlの基礎を抑えとく必要がある。今後、アソシエーションが複雑なテーブルを操作する時に苦労する。
saveメソッドは、booleanを返す。save!は例外を発生させる。
デバックの時に、使い分けることもあるとのこと。User.allはArrayクラスの配列ではなく、User::ActiveRecord_Relationクラスのオブジェクト。この理解がないと、今後、統合テストなどを実装する際にミスする。
# コンソールで、管理者権限をつける時は、このように属性をupdateさせる。
# updateメソッドとの違いはバリデーションを省略して単一属性を変更する点にある。
user.update_attribute(:admin, true)
# DBをいじりたくなくけど、モデル、DBの挙動を確認したい時、オプションをつける。
$ rails console --sandbox
- モデルのバリデーション機能は、テスト駆動開発と相性が良い。バリデーション機能が正常に機能しているかどうか、まず失敗するテストを書き、次にテストを成功させるように実装すると、期待した通りに動いている自信を持てるようになる。テストを書く意味が、 まずはここにある。
【モデルテストの流れ】
1.テストでバリデーションが通る条件のコードを記載。
2.テストをわざと失敗させる。
3.モデルクラスのバリデーションを設定。
4.テストを通す。
minitestのsetupメソッドは、rspecのbeforeに似ている。
[インスタンス].errors.full_messagesでバリデーション時のエラーメッセージを取得できる。デバック時に使える。
# string型でmigrateしたemailの文字数のmaxはstring型に合わせ255文字にすることがほぼ。
validates :email, presence: true, length: { maximum: 255 }
- %w[foo bar baz],%i[foo bar baz]は、多様する。
test "email validation should accept valid addresses" do
valid_addresses = %w[user@example.com USER@foo.COM A_US-ER@foo.bar.org
first.last@foo.jp alice+bob@baz.cn]
valid_addresses.each do |valid_address|
@user.email = valid_address
assert @user.valid?, "#{valid_address.inspect} should be valid"
end
end
"#{valid_address.inspect} sholud be valid"の記載で、どのemailにバリデーションがかかったか、わかりやすい。
# 一般的なemailカラムに関するバリデーション
# self.email = self.email.downcaseまたは{ self.email = email.downcase }とも書ける。
before_save { email.downcase! }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, length: { maximum: 255 },
format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false }
# case_sensitiveは大文字か小文字かを区別するメソッド
DBにカラムを作成するとき、そのカラムでレコードを検索する (find) 必要があるかどうかを考える。必要がある場合は、DB側でindexを付与してあげる。
dupは、同じ属性を持つデータを複製するためのメソッド。一意性のemailかどうかテストする時に使用すると有効。
-
has_secure_passwordを該当モデルのファイルに記述する意味
- ハッシュ化したパスワードをpassword_digestカラムに保存
- form_withなどでpassword, password_confirmationを使える。
- authenticateメソッドを使える。(controllerのcreateアクションの所で主に使う)
※bcrypt gemをbundle installする必要あり
7章:ユーザー登録
# parameterを追いたい時に便利。
# これはparamsに含まれている内容で、YAML形式で書かれている。YAMLは基本的にハッシュであり、コントローラとページのアクションを一意に指定している
<%= debug(params) if Rails.env.development? %>
<div>
</body>
# 下記でコンソールで出力するとデバック時などに情報を整理しやすい
puts user.attributes.to_yaml
/* デバックの表示をかっこよくする */
@mixin box_sizing {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.
.
.
/* miscellaneous */
.debug_dump {
clear: both;
float: left;
width: 100%;
margin-top: 45px;
@include box_sizing;
params[:id]は文字列型の "1" ですが、findメソッドでは自動的に整数型に変換させる。
※parameterで送られている際は、id: '1'と文字列。debuggerメソッドの他に、別途gemが必要だけどbinding.pryもある。
Gravatarを使えば、画像の置き場所の悩みを解決します。このメリットは大きい。gemとはもいらない。
反映させる画像は、メールアドレスに紐づいている。
module UsersHelper
# 引数で与えられたユーザーのGravatar画像を返す
# Rubyでは、Digestライブラリのhexdigestメソッドを使うと、MD5のハッシュ化ができる。
# def gravatar_for(user, options = { size: 80 })
# def gravatar_for(user, size: 80)でサイズ指定ができる。
def gravatar_for(user)
gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}"
image_tag(gravatar_url, alt: user.name, class: "gravatar")
end
end
<%= gravatar_for @user %>
cssでの要素しての時に「first-child」「last-child」を使うと、子要素の指定が楽で便利。
、無効な内容の送信によって元のページに戻されると、CSSクラスfield_with_errorsを持ったdivタグでエラー箇所を自動的に囲んでくれる。
本番環境のSSL化
Rails.application.configure do
.
# Force all access to the app over SSL, use Strict-Transport-Security,
# and use secure cookies.
config.force_ssl = true
.
end
herokuで独自ドメインを設定する場合は、別途 SSL証明書の発行とセットアップが必要。
https://devcenter.heroku.com/articles/ssl
herokuのwebサーバーをpumaに切り替える方法
https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server