淺談Rails 4 中Strong Parameters機制

本文介绍了Rails 4中StrongParameters机制的变化,解释了如何在控制器中实现参数过滤,以解决MassAssignment的安全问题,并对比了Rails 3中的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要弄明白Rails 4 中Strong Parameters機制,首先我們要看看Rails3中的Parameters


在 Rails3 中創建或更新 Active Record 對象時,會有 Mass Assignment 安全問題。所以 Model 中需要列一個白名單,聲明哪些屬性可以被 parameter 的數據更新。


Rails 3




# kings_controller.rb
def create
#{ name: 『David', sex:male, age: 31}
@king = King.new(params[:king])
if @king.save
redirect_to @king
else
render 'new'
end
end

# king.rb
class King
attr_accessible :name
end


Rails 4


Rails 4 引入了 Strong Parameters 的機制,Model 不再負責白名單的維護,把過濾非法屬性的職責推給了 Controller。




# kings_controller.rb
def create
# new parameter { name: 『David' }
@king = King.new(king_params)
if @king.save
redirect_to @king
else
render 'new'
end
end

private

def king_params
# old parameter { name: 『David', sex:male, age: 31}
# new parameter { name: 『David' }
params[:king].permit(:name)
end

# king.rb
class King

end 


什麼是 Strong Parameters?



說白了 Strong Parameter 其是就是一層白名單過濾。


View 層穿過來的數據會轉化為一個 ActionController::Parameters 對象


過濾老的 ActionController::Parameters 對象,生成一個新的 ActionController::Parameters 對象。


* 只保留白名單屬性

* 實例變數 @permitted 賦為 true

把過濾後的 ActionController::Parameters 對象傳給 model,創建或更新對應的的 ActiveRecord 對象。

可以硬傳給 model,霸王硬上弓嗎?


未經 Strong Parameter 過濾的 ActionController::Parameters 對象的 @permitted 為 false(過濾後為 true)。如果硬傳給 Model,會報錯 ActiveModel::ForbiddenAttributesError 。

如果本站有幫助到您,請不吝於給一個讚鼓勵!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值