#14 楼 @ginchenorlee Terry 很健谈的,尤其是谈一些技术和项目上的东西,突然间两眼放光的!
#4 楼 @hlt http://pragmatic.ly 这个项目。对远程管理项目非常有效。
对了今年有 Tealeaf Academy 的同学去参加 RubyConfChina 么?我给大家带一些 Tealeaf Academy 印制的正版 T-shirt,免费哦!
第一次听 @beenhero 说到这个作息时间后,我也尝试了将近一个月。
嘿,这一个月体验下来,白天精神饱满了,工作效率提高了,身体抵抗力变强了,就连打 Dota 都能一口气超神了!
初到杭州,报名 +1
这里有一个 Tealeaf 学员对课程的经验分享(我的也在里面了)
http://community.gotealeaf.com/t/share-your-experience-of-learning-with-tealeaf-academy/
#25 楼 @ChanceDoor 用到 devise 了呀,这个是课程上讲的一些重构的知识 主要是 Object Oriented 的概念,好处是这样做虽然代码增加了很多,但是如果重用其中的方法会很方便,而且随着 app 不断庞大结构还是会很清晰。
我可能还是没有掌握好这种模式,所以你看眼花了。
这是 @knwang 推荐的扩展阅读:
http://blip.tv/rubynation/jeff-casimir-fat-models-aren-t-enough-5562605 http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/
#23 楼 @ChanceDoor 刚才有一个 initialize 的错误,重新修改了。
@ChanceDoor 没有看到你已经重构一轮了,我这个是从你最初的代码开始重构的。
我也是新手,上完 @knwang 老师的课程后学到的,用了 service object 和 domain object 仅供参考(对 devise 和 Savon 不熟悉,而且还没有完全掌握)。
#app/controller/sessions_controller.rb
class SessionsController < Devise::SessionsController
def create
#首先调用API验证动态令牌
param={
'AuthName' => params[:user][:email],
'AuthPasswd' => params[:user][:ikey],
}
client = Savon.client(wsdl: "#{request.protocol}#{request.host_with_port}/Auth.wsdl")
self.resource = warden.authenticate!(auth_options)
result = LoginDeduction.new(client.call(params), resource, sign_in(resource_name, resource)).deduct
if !result.dynamic_validation_pass?
redirect_to login_path, alert: "Ikey error : Invalid username or ikey." #动态令牌验证失败
elsif result.sign_in? && result.term_expired?
sign_out
redirect_to login_path, alert: "Account error : This account is expired."
else
set_flash_message(:notice, :signed_in) if is_navigational_format?
respond_with resource, location: after_sign_in_path_for(resource)
end
end
end
#app/serives/login_deduction.rb
class LoginDeduction
attr_reader :dynamic_validation_result, :user_term, :sign_in_result
alias_method :sign_in?, :sign_in_result
alias_method :dynamic_validation_pass?, :dynamic_validation_result
def initialize(result, resource, sign_in_result)
@dynamic_validation_result = result
@user_term = UserTermPolicy.new(resource.deadline)
@sign_in_result = sign_in_result
end
def deduct
if dynamic_validation_pass?
deduct_user_sign_in
else
LoginResult.new(dynamic_validation: false, sign_in: false)
end
end
def deduct_user_sign_in
if sign_in? #devise的登录成功
user_term = UserTermPolicy.new(resource.deadline)
if user_term.has_a_deadtime? #如果有过期时间
if user_term.is_expired? #如果已过期 登录失败
LoginResult.new(sign_in: true, dynamic_validation: true, expired: true)
else
LoginResult.new(sign_in: true, dynamic_validation: true)
end
else
UserTerm.new(user).update_deadline # 如果没有过期时间 即新账号 就写入过期时间为一个月后,并登陆成功
LoginResult.new(sign_in: true, dynamic_validation: true)
end
else
LoginResult.new(sign_in: false, dynamic_validation: true)
end
end
end
class LoginResult
attr_reader :dynamic_validation, :sign_in, :expired
alias_method :dynamic_validation_pass?, :dynamic_validation
alias_method :sign_in?, :sign_in
alias_method :term_expired?, :expired
def initialize(options={})
@dynamic_validation = options[:dynamic_validation]
@sign_in = options[:sign_in]
@expired = options[:expired]
end
end
#app/models/user_term.rb
class UserTerm
attr_accessor :user
def initialize(user)
@user = user
end
def update_deadline
user.update_attributes(deadline: Time.now + 1.month)
end
end
#app/models/user_term_policy.rb
class UserTermPolicy
attr_reader :deadtime
def initialize(deadtime)
@deadtime = deadtime
end
def has_a_deadtime?
deadtime != nil
end
def is_expired?
deadtime <= Time.now
end
end
支持!@xmonkeycn 太棒了,我也想贡献代码!
如果是 railscasts pro 账户的话 这里有一个 http://railscasts.com/episodes/114-endless-page-revised
还有一个是免费的,不过是很早以前的 http://railscasts.com/episodes/114-endless-page
已经报名 10 月 24 号 的英文课程了,当然还是期待中文的。大家报名啊!!
谢谢了 我去试试
thx,不过还是提示错误。说 gem 没有被安装。
我也报名参加 Rails Tutors 了,不知道人够不够组一个中文学习小组
#5 楼 @poshboytl 我在用 ML GM 没有声音。。。
还在持续期待中。。。难道真的没有下文了?
。。。没有下文了?求分享