attr_accessible和强参数的区别
Difference between attr_accessible and strong parameters
我刚刚在几个不同的位置阅读了一些关于 attr_accessor
、attr_accessible
和强参数的资料:
Difference between attr_accessor and attr_accessible
How is attr_accessible used in Rails 4?
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
和强参数有什么区别呢?它们只是同一事物的不同名称吗?为什么我们要从一个转移到另一个?
欢迎提供任何信息。
attr_accessible 已在 Rails 4 中弃用,取而代之的是强参数。
两者都是解决质量分配问题的不同方法,但强参数更灵活。
例如,您有一个具有属性 email:string
和 is_admin:boolean
的 User
模型。您希望允许用户通过表单而不是 is_admin
字段修改他们的电子邮件。
在 Rails 3 你应该做的:
attr_accesible :email
使用这种方法,用户无法修改 is_admin
,因为该属性受到保护。
强参数的好处之一是您可以在控制器中执行以下操作:
def user_params
if current_user.admin?
params.require(:user).permit(:email, :is_admin)
else
params.require(:user).permit(:email)
end
end
这样一来,管理员用户将能够修改 is_admin
而普通用户则不能。
这只是一个示例,并不是向用户授予管理权限的最佳方式,但它非常具有说明性。
Strong Parameters 的主要优点是它们在控制器中定义,并且可以在 运行 时间内动态分配。 attr_accessible 是一种将属性列入白名单的更加静态和单一的方式。
另一方面,attr_accessor 是完全不同的东西,仍然可以在 Rails 4 中使用,例如,如果您需要模型中的一个属性,则不必坚持或被写入数据库,但您需要以一种形式。想想:
attr_accessor :has_accepted_legal_terms
这是一个Ruby方法,可用于声明与数据库无关的模型属性,Class或PORO(普通旧ruby 对象)。
强参数和attr_accessible
是为Rails"mass assignment"特性添加安全保护的两种不同方式。 Strong Parameters 是当前版本Rails.
规定的方式
"Mass assignment" 是 Rails 中一个方便的 shorthand,允许您在单个语句中设置模型的许多属性。
例如,假设您有一个 @user
想要使用来自表单提交的数据进行更新。如果没有批量分配,您将不得不像这样编写乏味的代码:
@user.first_name = params[:user][:first_name]
@user.last_name = params[:user][:last_name]
@user.phone_number = params[:user][:phone_number]
...
@user.save
每个表单字段都在继续。
通过批量分配,所有这些代码都变成了一行:
@user.update(params[:user])
但是,这充满了安全漏洞。由于 params
包含浏览器提交的任何数据,恶意用户可以向您提交的数据添加数据没想到。例如,他们可以将 is_admin=1
添加到参数中。如果你有一个 is_admin
数据库列,那么批量分配只是让用户升级为管理员。哎呀!
这就是强参数的用武之地。使用强参数,如果您尝试执行天真的 update(params[:user])
,Rails 将引发 ActiveModel::ForbiddenAttributesError
。相反,您需要使用 Strong Parameters 提供的 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)
我不能代表 Rails 的维护者,但我喜欢 Strong Parameters,因为它很灵活。如果我在用户控制器中有多个需要不同参数的操作,我可以使用 permit
轻松描述应该允许的参数。
或者,如果我有不同的用户角色可以更新不同的属性,那么我可以轻松地对这些权限进行建模。正如@CV-Gate 提到的,您甚至可以在运行时更改这些权限,这是一个强大的功能。
简而言之,强参数的灵活性在于您可以随心所欲地定义 user_params
方法。您拥有 Ruby 和 OO 概念的全部功能,可以使它按您想要的方式工作。
那attr_accessible
呢?
无需过多赘述(因为 Rails 不再支持此功能):您可以使用 attr_accessible
而不是使用 permit
方法来做类似的事情模型本身的宏,像这样:
class User < ActiveRecord::Base
attr_accessible :first_name, :last_name, :phone_number
...
end
所以对于简单的情况,它的工作原理与强参数非常相似;您只需在不同的地方定义属性列表。
然而,由于 attr_accessible
与模型的定义 class 强耦合,你失去了很多灵活性。如果您有两个不同的控制器动作需要为同一个 User
模型进行质量分配怎么办?现在你被卡住了。
attr_accessor
attr_accessor
宏内置于 Ruby 中,与 Rails、批量分配或安全性无关。它恰好有一个相似的名字。 :)
我刚刚在几个不同的位置阅读了一些关于 attr_accessor
、attr_accessible
和强参数的资料:
Difference between attr_accessor and attr_accessible
How is attr_accessible used in Rails 4?
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
和强参数有什么区别呢?它们只是同一事物的不同名称吗?为什么我们要从一个转移到另一个?
欢迎提供任何信息。
attr_accessible 已在 Rails 4 中弃用,取而代之的是强参数。
两者都是解决质量分配问题的不同方法,但强参数更灵活。
例如,您有一个具有属性 email:string
和 is_admin:boolean
的 User
模型。您希望允许用户通过表单而不是 is_admin
字段修改他们的电子邮件。
在 Rails 3 你应该做的:
attr_accesible :email
使用这种方法,用户无法修改 is_admin
,因为该属性受到保护。
强参数的好处之一是您可以在控制器中执行以下操作:
def user_params
if current_user.admin?
params.require(:user).permit(:email, :is_admin)
else
params.require(:user).permit(:email)
end
end
这样一来,管理员用户将能够修改 is_admin
而普通用户则不能。
这只是一个示例,并不是向用户授予管理权限的最佳方式,但它非常具有说明性。
Strong Parameters 的主要优点是它们在控制器中定义,并且可以在 运行 时间内动态分配。 attr_accessible 是一种将属性列入白名单的更加静态和单一的方式。
另一方面,attr_accessor 是完全不同的东西,仍然可以在 Rails 4 中使用,例如,如果您需要模型中的一个属性,则不必坚持或被写入数据库,但您需要以一种形式。想想:
attr_accessor :has_accepted_legal_terms
这是一个Ruby方法,可用于声明与数据库无关的模型属性,Class或PORO(普通旧ruby 对象)。
强参数和attr_accessible
是为Rails"mass assignment"特性添加安全保护的两种不同方式。 Strong Parameters 是当前版本Rails.
"Mass assignment" 是 Rails 中一个方便的 shorthand,允许您在单个语句中设置模型的许多属性。
例如,假设您有一个 @user
想要使用来自表单提交的数据进行更新。如果没有批量分配,您将不得不像这样编写乏味的代码:
@user.first_name = params[:user][:first_name]
@user.last_name = params[:user][:last_name]
@user.phone_number = params[:user][:phone_number]
...
@user.save
每个表单字段都在继续。
通过批量分配,所有这些代码都变成了一行:
@user.update(params[:user])
但是,这充满了安全漏洞。由于 params
包含浏览器提交的任何数据,恶意用户可以向您提交的数据添加数据没想到。例如,他们可以将 is_admin=1
添加到参数中。如果你有一个 is_admin
数据库列,那么批量分配只是让用户升级为管理员。哎呀!
这就是强参数的用武之地。使用强参数,如果您尝试执行天真的 update(params[:user])
,Rails 将引发 ActiveModel::ForbiddenAttributesError
。相反,您需要使用 Strong Parameters 提供的 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)
我不能代表 Rails 的维护者,但我喜欢 Strong Parameters,因为它很灵活。如果我在用户控制器中有多个需要不同参数的操作,我可以使用 permit
轻松描述应该允许的参数。
或者,如果我有不同的用户角色可以更新不同的属性,那么我可以轻松地对这些权限进行建模。正如@CV-Gate 提到的,您甚至可以在运行时更改这些权限,这是一个强大的功能。
简而言之,强参数的灵活性在于您可以随心所欲地定义 user_params
方法。您拥有 Ruby 和 OO 概念的全部功能,可以使它按您想要的方式工作。
那attr_accessible
呢?
无需过多赘述(因为 Rails 不再支持此功能):您可以使用 attr_accessible
而不是使用 permit
方法来做类似的事情模型本身的宏,像这样:
class User < ActiveRecord::Base
attr_accessible :first_name, :last_name, :phone_number
...
end
所以对于简单的情况,它的工作原理与强参数非常相似;您只需在不同的地方定义属性列表。
然而,由于 attr_accessible
与模型的定义 class 强耦合,你失去了很多灵活性。如果您有两个不同的控制器动作需要为同一个 User
模型进行质量分配怎么办?现在你被卡住了。
attr_accessor
attr_accessor
宏内置于 Ruby 中,与 Rails、批量分配或安全性无关。它恰好有一个相似的名字。 :)