Ruby on Rails 11章後半をやりました。
●メタプログラミング(send)
ようはJavaでいうリフレクションですね。
>> ary
=> [“a”, “b”, “c”, “d”, “e”, “f”, “g”, “h”, “i”, “j”, “k”, “l”,
“m”, “n”, “o”, “p”, “q”, “r”, “s”, “t”, “u”, “v”, “w”, “x”, “y”, “z”]
>> ary.length
=> 26
>> ary.send(:length)
=> 26
>> ary.send(“length”)
=> 26
●メールのログをtailで流す
テキスト→htmlの順にログに出てた。
テキストだけひっかけられれば足りる。
tail -f -n 30 log/development.log | grep UserMailer -A 30
●minitestでメールの送信をテストする
ActionMailer::Base.deliveries.clear
setupにいれる。deliveriesは配列でメッセージを管理している。
assert_equal 1, ActionMailer::Base.deliveries.size
1通来てるよね!を確認。
assigns(:user)
コントローラの@userにアクセス。
●チュートリアルコードの良くないと思われるところ。
・send/リフレクションを説明するためにauthenticated?の第1引数にattributeを追加して
好き勝手出来るようにしてあるのはいかがなものか。
↓個人的には…。userモデルの外に出さない。
#rememberのトークンで認証する
def remember_authenticated?(remember_token)
return authenticated?(:remember, remember_token)
end
#トークンがダイジェストと一致するか.
private
def authenticated?(atr, token)
digest = self.send(“#{atr}_digest”)
return false if digest.nil?
BCrypt::Password.new(digest).is_password?(token)
end
・コントローラにIFのネストがあるし、
コントローラに書くべきではないID/PWの組み合わせ等が書いてあったりでいけてない。
↓こんな感じにリファクタリング
def create
@user = find_valid_user(params[:session][:email], params[:session][:password])
user = @user
if !user
flash.now[:danger] = ‘invalid email/password combination’
render ‘new’
return
end
if !user.activated?
message = “Account not activated.”
message += “Check your email for the activation link.”
flash[:warning] = message
redirect_to root_url
return
end
log_in(user)
params[:session][:remember_me] == ‘1’ ? remember(user) : forget(user)
#redirect_to user
redirect_back_or( user )
end
・Activateする処理をコントローラに書いている
→とおもったらこれは後々リファクタリングネタとして出てくる。