Adr*_*ann 10 attr-accessible strong-parameters ruby-on-rails-4
我刚才已经做了一点阅读attr_accessor,attr_accessible和强大的参数在几个不同的位置:
attr_accessor和attr_accessible之间的区别
如何在Rails 4中使用attr_accessible?
http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html
而我正在考虑大规模任务:
http://code.tutsplus.com/tutorials/mass-assignment-rails-and-you--net-31695
我无法理解attr_accessible与强参数之间的区别.我对上述主题的理解并不是100%自信所以我可能会错过一些简单但我知道他们做类似的工作.
但是,attr_accessible强参数有什么区别?它们只是同一个东西的不同名称吗?我们为什么要从一个移到另一个?
任何信息表示赞赏.
CV-*_*ate 19
在Rails 4中已弃用attr_accessible以支持Strong Parameters.
两者都是质量分配问题的不同方法,但强参数更灵活.
例如,您有一个User具有属性email:string和的模型is_admin:boolean.您希望允许用户通过表单而非is_admin字段修改其电子邮件.
在Rails 3中,您应该:
attr_accesible :email
Run Code Online (Sandbox Code Playgroud)
使用此方法,用户无法修改,is_admin因为该属性受到保护.
强参数的好处之一是您可以在控制器中执行以下操作:
def user_params
if current_user.admin?
params.require(:user).permit(:email, :is_admin)
else
params.require(:user).permit(:email)
end
end
Run Code Online (Sandbox Code Playgroud)
这样,一个管理员用户将能够修改,is_admin而普通用户则不会.
这只是一个示例,而不是向用户授予管理权限的最佳方式,但它非常具有说明性.
Strong Parameters的主要优点是它们在控制器中定义,可以在运行时动态分配.attr_accessible是一种更加静态和单一的白名单属性方式.
另一方面,attr_accessor是完全不同的东西,仍然可以在Rails 4中使用,例如,如果你的模型中需要一个属性,它不需要持久存储或写入数据库,但是你需要在表单中.想一想:
attr_accessor :has_accepted_legal_terms
它是一个Ruby方法,可用于声明与数据库无关的模型属性,Class或PORO(普通旧ruby对象)的属性.
强参数,attr_accessible是两种不同的方法,可以为Rails"质量分配"功能添加安全保护.强参数是当前版本的Rails规定的方式.
"批量分配"是Rails中的一种方便的简写,允许您在单个语句中设置模型的许多属性.
例如,假设您@user想要使用表单提交中的数据进行更新.如果没有批量分配,你必须编写像这样繁琐的代码:
@user.first_name = params[:user][:first_name]
@user.last_name = params[:user][:last_name]
@user.phone_number = params[:user][:phone_number]
...
@user.save
Run Code Online (Sandbox Code Playgroud)
每个表格领域都在不断.
通过质量分配,所有代码都变为一行:
@user.update(params[:user])
Run Code Online (Sandbox Code Playgroud)
但是,这充满了安全漏洞.由于params包含浏览器提交的任何数据,恶意用户可以将数据添加到您不期望的提交.例如,他们可以添加is_admin=1参数.如果您有is_admin数据库列,那么批量分配只是让用户升级到管理员.哎呀!
这就是强参数的用武之地.有了强参数,ActiveModel::ForbiddenAttributesError如果你尝试做天真的话,Rails会引发一个update(params[:user]).相反,您需要使用强参数提供的require和permit帮助程序明确说明您希望从浏览器提交的参数.像这样:
def user_params
# Note that :is_admin is not permitted!
params.require(:user).permit(:first_name, :last_name, :phone_number)
end
...
@user.update(user_params)
Run Code Online (Sandbox Code Playgroud)
我不能代表Rails的维护者,但我喜欢Strong Parameters,因为它很灵活.如果我在用户控制器中有多个期望不同参数的操作,我可以使用permit应该允许的参数轻松描述.
或者如果我有不同的用户角色允许更新不同的属性,那么我可以轻松地建模这些权限.正如@ CV-Gate所提到的,您甚至可以在运行时更改这些权限,这是一个功能强大的权限.
简而言之,强参数的灵活性是由于您可以user_params在任何地方定义该方法,无论您喜欢什么.您拥有Ruby和OO概念的全部功能,使其按您希望的方式工作.
怎么样attr_accessible?
没有太多的细节(因为Rails不再支持这个功能):permit你可以使用attr_accessible模型本身的宏来做类似的事情,而不是使用方法,如下所示:
class User < ActiveRecord::Base
attr_accessible :first_name, :last_name, :phone_number
...
end
Run Code Online (Sandbox Code Playgroud)
因此对于简单的情况,它与强参数非常相似; 您只需在不同的位置定义属性列表.
但是,由于attr_accessible与模型类的定义强烈耦合,因此会失去很大的灵活性.如果您有两个不同的控制器动作需要为同一User模型进行质量分配,该怎么办?现在你被卡住了.
attr_accessor
该attr_accessor宏被内置到Ruby和无关使用Rails,质量分配,或安全.它碰巧有一个类似的名字.:)
| 归档时间: |
|
| 查看次数: |
5045 次 |
| 最近记录: |