浅谈Rails 4 中Strong Parameters机制

 更新时间:2014年06月25日 15:30:13   投稿:hebedich  
本文主要是通过Rails3中的Parameters与Rails4中新引入的Strong Parameters机制进行对比,从而得出他们直接的异同

要弄明白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 。

相关文章

  • Ruby和元编程之万物皆为对象

    Ruby和元编程之万物皆为对象

    这篇文章主要介绍了Ruby和元编程之万物皆为对象,想要掌握Ruby和Ruby的元编程,对象就是第一门必修功课,需要的朋友可以参考下
    2014-10-10
  • ruby迭代map的简洁写法实现原理分析

    ruby迭代map的简洁写法实现原理分析

    这篇文章主要介绍了ruby迭代map的简洁写法实现原理分析,本文着重对简洁写法的原理进行解析,需要的朋友可以参考下
    2014-11-11
  • Ruby语言中的String深入理解

    Ruby语言中的String深入理解

    在java中,对于字面量的字符串,jvm内部维持一张表,因此如果在java中,str1和str2是同一个String对象。而在Ruby中, str1和str2是完全不同的对象。
    2011-01-01
  • Ruby中Block和迭代器的使用讲解

    Ruby中Block和迭代器的使用讲解

    这篇文章主要介绍了Ruby中Block和迭代器的使用,是Ruby入门学习中的基础知识,需要的朋友可以参考下
    2015-07-07
  • 举例初步讲解Ruby中的正则表达式

    举例初步讲解Ruby中的正则表达式

    这篇文章主要介绍了Ruby中的正则表达式,是Ruby学习进阶当中的重要知识,需要的朋友可以参考下
    2015-05-05
  • 深入分析Ruby 变量

    深入分析Ruby 变量

    这篇文章主要介绍了Ruby 变量的的相关资料,文中详细的讲解了几种变量的概念与用法,帮助大家更好的学习,感兴趣的朋友可以了解下
    2020-06-06
  • 详解Ruby中的异常

    详解Ruby中的异常

    这篇文章主要介绍了详解Ruby中的异常,异常的抛出和处理是各种编程语言学习中基础知识,需要的朋友可以参考下
    2015-04-04
  • 用Ruby实现一个单元测试框架的教程

    用Ruby实现一个单元测试框架的教程

    这篇文章主要介绍了用Ruby实现一个单元测试框架的教程,在检测Ruby代码bug的时候非常有用,需要的朋友可以参考下
    2015-04-04
  • Ruby简明教程之数组和Hash介绍

    Ruby简明教程之数组和Hash介绍

    这篇文章主要介绍了Ruby简明教程之数组和Hash介绍,非常简洁的讲解,可以作为语法备忘,需要的朋友可以参考下
    2014-06-06
  • Ruby中使用多线程队列(Queue)实现下载博客文章保存到本地文件

    Ruby中使用多线程队列(Queue)实现下载博客文章保存到本地文件

    这篇文章主要介绍了Ruby中使用多线程队列(Queue)实现下载博客文章保存到本地文件,本文给出了实现代码、并对代码的核心部分做了讲解,同时给出了运行效果图,需要的朋友可以参考下
    2015-01-01

最新评论