Rails Rails 中的虚拟属性还是不明白

tiseheaini · 2012年03月27日 · 最后由 pongyo 回复于 2012年03月27日 · 6169 次阅读

Rails 中的虚拟属性还是让我很不明白,我原来是用 PHP 写网页的。习惯性的使用表单 POST 或 GET 传过来的数据,然后在数据库的字段上单独赋值,就像这样 @user = User.new @user.email = params[:user][:email] @user.salt = salt = User.get_salt ## User 模型类中定义了 get_salt 方法用于生成 salt ## User 模型类中定义了 user_hexdigest 方法用于加密密码并保存 使用了@poshboytl 太檑老师的部分代码 @user.digestpassword= User.user_hexdigest(salt,params[:user][:password])
@user.save

我觉得使用这样的方式虽然很麻烦,但很直观,对于我这样的小白可以很方便的查错,而且很容易在脑中去构思网站。ruby 很开放的,应该允许这样的编码风格,求教

虚拟属性?你应该称之为“消息选择器”才对

@user = User.new
@user.email = params[:user][:email]
@user.password = params[:user][:password]
# @user.digestpassword =>  User.user_hexdigest(salt,params[:user][:password])
@user.save

password 是一个虚属性,你只要给他赋值就好了。他封装了你的逻辑,使你的代码看起来更简洁,不是更好吗

个人认为这是两种不同语言体系结构差异带来的编程思路问题,ruby 强在元编程、灵活性,可以使用元编程思想来封装复杂逻辑,提供简单的用户接口,但是弊端在于比较难以调试,php 等静态语言就是一板一眼,用户表有什么就定义什么属性,但是增删改查都得手动进行,调试方便了,但是代码量就上去了。这两种没什么好不好的,主要还是思路不一样。不过我觉得,既然用 Rails,那就应该充分利用 ruby 的特性来解决问题,就像用 C++ 写出来 C 风格的代码,何必呢。

#2 楼 @hysios 我的数据库中没有 password 字段,那么@user.password能给数据库中的字段赋值吗?还是说 rails 的实现就是调用表单传过来的数据,例如表单传过来的数据为 params[:user][:email] 和 params[:user][:password],然后 Rails 就调用@user.email方法和@user.password方法。只要我写好 password 方法的实现,Rails 就会帮我完成后续的操作,比如加密和保存,对吗??

我没有看过这部分源码,个人猜测流程是这样的: 重定义 password 属性赋值方法(method_missing 捕捉或是其他方法),当调用了 password=方法时自动触发对应的 digestpassword 属性赋值,最后 save。 其实可以换一种角度看问题,你把这个 password 当成一个方法而不是属性就好理解了(当然这个方法本身可能也是不存在的)

#3 楼 @alucardpj 谢谢指点,可能是有点不习惯吧。你说的很对,我现在已经决定用 Rails 了为什么还要用 PHP 的方式去写代码呢?我相信我会很快就习惯了。

#4 楼 @tiseheaini

attr_accessor :password
def password=(value)
    self.digestpassword = User.user_hexdigest(User.get_salt,value)
end

password 的实现会是这样的,应该很容易看懂吧

跟 php, rails 没关系,这个是程序员编码习惯问题。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号