新手问题 Rails 中的 fields 和 attr_accessible 有什么区别吗?

Blues · 2013年07月14日 · 最后由 Blues 回复于 2013年07月14日 · 6430 次阅读

最近看公司的新项目的源代码的时候,发现里面的 model 定义的属性全部都是 fields,比如说类似这样的: fields :name, :email, :password,....

但是我看 Ruby on Rails tutorial 的时候作者都是这样写的: attr_accessible :name, :email, :password,....

请问这个 fields 和 attr_accessible 有什么区别吗?

PS:我看书的时候知道了,attr_accessible 其实是一个函数,这行代码 attr_accessible :name, :email, :password,....其实就是给 name,email,password,....这些字段定义了 getter 和 setter 方法,然后就可以使用 user.name 和 user.name = @"guest"这样的方式去访问了,不知道理解的对不对。

谢谢!

对的。看来你学过 Java.

先要注意 model 是基于什么 ORM 的,Mongoid 用 field 声明字段,ActiveRecord 不用在 modle 声明字段。attr_accessible 是 ActiveModle 提供的类宏,用来做安全过滤。

attr_accessor 才是定义 getter setter。

#1 楼 @hunter 额。。。我没学过 Java,以前主要是做 C/C++ 的,现在做 Objc,然后刚刚有一个 ror 的项目接手。

#3 楼 @Rei attr_accessor 我看到过,是 Ruby 中定义 getter 和 setter 的,而 attr_accessible 是在 Rails 中使用的,和 Ruby 稍微有点不同,但是我不知道为什么会这样。

#2 楼 @Rei model 是什么 ORM 我不太明白,只知道使用的是一个在线数据库,那个里面的数据导出来之后是 JSON 的格式。

#6 楼 @Blues 应该就 mongdb,orm 应该是 mongoid,看看 Gemfile 里有没有 mongoid 就知道了

这得好好看书或文档了。

#5 楼 @Blues keywords: rails mass assignment

#9 楼 @winterwhisper 书中的解释是这样的: class User < ActiveRecord::Base attr_accessible :name, :email end 上述代码的作用和你想象的可能有些差别。默认情况下,模型中所有的属性都是可访问的,代码 6.6 的作用是确保普通用户能且只能访问 name 和 email 属性。第七章会介绍这么做的重要意义,即使用 attr_accessible 可以避免 mass assignment 漏洞,这是 Rails 应用程序最常见的安全漏洞之一。 我想确认的是: 是否在 :name, :email 之前不加 attr_accessible,就无法用@user.name@user.email这样的方式去访问和设置:name 和 :email 了?

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