`
yangzhihuan
  • 浏览: 168252 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

在Rails的controller中访问params的一个小细节

阅读更多
大家都知道controller中的params其实是一个Hash.
一般params中的数据,从log可以看到如下的样式:
Parameters: {"authenticity_token"=>"AOE3ui28pCMQpMuR77aY1EkoKVaAV1T05uep5to2X4Q=", "user"=>{"name"=>"yanghuan", "password_confirmation"=>"1234567", "password"=>"12345678"}}

按照标准的Hash方法,应当这样使用:
name = params["user"]["name"] # 请注意,用是的string,而不是symbal

#但是一般我们都是使用symbal来访问的
name = params[:user][:name]


请看注意看到log的数据,params中的key是string而不是symbal
h = {"name" =>'string'}
h[:name] = 'symbal'
puts h # => {"name"=>"string", :name=>"symbal"}
#可见,"name" 与 :name 是两个不同的key

但是在params中,我们可以使用symbal来访问,那是因为rails对params做了增强(我没有去看rails关于params的源代码)

之前我一直没有留意这个细微的区别,直到有一天,我写下了如下代码:
conditions = {}.merge(params)
conditions.delete_if{|k,v| !v.is_a?(String) || v.eql?('') || %w{-1 0}.include?(v.to_s) || %w{action format controller commit page}.include?(k.to_s) }

if conditions[:user][:name] == 'ooxx'
  # 使用symbal是访问不了的...
  # code ...
end

然后就上演了一出反复调试的悲剧...

撰文记之,告诫一下自己要注意细节.
1
0
分享到:
评论
1 楼 dongxuef 2012-10-31  
正奇怪呢,原来你也没深究.
源码中_params被default处理了

相关推荐

    Rails里给文件上传添加progress_bar

    通过以上步骤,你可以在Rails应用中实现一个基本的文件上传进度条功能。这个功能不仅提升了用户体验,还能帮助用户了解文件上传的状态,避免了因为不确定的等待时间而产生的焦虑感。在实际项目中,你还可以根据需求...

    rails 15 分钟博客

    "Rails 15分钟博客"是一份教程,旨在引导初学者在15分钟内快速搭建一个基本的博客系统,体验Rails的强大与高效。 首先,让我们了解一下Rails的核心概念: 1. MVC架构:Rails中的MVC代表模型(Model)、视图(View...

    Ruby on rails开发从头来

    本教程将引导你从零开始学习Ruby on Rails的开发,通过一个具体的实例项目——Depot应用,让你深入理解Rails的工作原理和开发流程。 首先,让我们深入了解Ruby语言。Ruby是一种动态类型、面向对象的脚本语言,以其...

    rails _sunspot 学习笔记

    Sunspot 是一个用于 Ruby on Rails 的灵活且强大的全文检索框架。它基于 Solr 和 Lucene 构建,可以方便地集成到 Rails 应用中,为用户提供高效的搜索功能。 #### 二、Sunspot 安装 在开始之前,请确保已经安装了...

    rails登陆画面(原)

    Rails 是一个基于 Ruby 语言的开源 Web 应用框架,它遵循 Model-View-Controller (MVC) 设计模式,旨在让开发者能够更高效地构建功能丰富的 web 应用程序。在 Rails 中,登录功能是许多 web 应用程序的基础部分,...

    浅谈Rails 4 中Strong Parameters机制

    所以 Model 中需要列一个白名单,声明哪些属性可以被 parameter 的数据更新。 Rails 3 # kings_controller.rb def create #{ name: ‘David', sex:male, age: 31} @king = King.new(params[:king]) if @king....

    rails_api_with_controller

    标题 "rails_api_with_controller" 暗示我们将探讨如何在Ruby on Rails框架中构建一个API,特别是使用Controller来实现。Rails API模式专为创建数据驱动的Web服务而设计,通常用于构建后端服务,供前端应用程序(如...

    Rails 4 Application Development.pdf

    Rails 4是Ruby on Rails(简称Rails)的一个重要版本,它是一种用于Web应用程序开发的模型-视图-控制器(Model-View-Controller,MVC)架构框架。Rails 4引入了许多新特性与改进,旨在提高开发效率和应用程序的安全...

    params_for:使用 ActiveModel 电源验证 Rails 控制器参数

    安装将此行添加到您的应用程序的Gemfile : gem 'params_for' 然后执行: $ bundle或者自己安装: $ gem install params_for用法在您的控制器中: # app/controllers/fancy_controller.rbclass FancyController <...

    Rails3-使用ajax处理并发

    Rails是一个流行的Web应用程序开发框架,它基于Ruby语言,而Ajax(Asynchronous JavaScript and XML)则是一种允许网页部分刷新的技术,无需重新加载整个页面。在Rails中,使用Ajax可以实现更流畅、更高效的用户体验...

    Beginning Google Maps Applications with Rails and Ajax

    - **准备工作**:首先,开发者需要注册一个Google Maps API密钥,并在Rails项目中设置好相应的环境变量。接下来,需要安装必要的gem,如`google_maps_service`等,以便能够调用API接口。 - **基本步骤**: 1. **...

    Rails中应用Ext.tree:以中国的省市地区三级联动选择为例

    在省市地区联动选择的例子中,我们可以创建一个模型,如`Region`,并用`acts_as_nested_set`来管理其层级关系。 首先,我们需要添加`acts_as_nested_set`到项目中。在Gemfile中加入以下行: ```ruby gem 'nested_...

    draper:用于Rails应用程序的DecoratorsView模型

    Draper向Rails应用程序中添加了一个面向对象的表示逻辑层。 如果没有Draper,则此功能可能已在过程帮助器中纠结在一起或为模型增加了体积。 借助Draper装饰器,您可以使用与演示文稿相关的逻辑包装模型,以更有效...

    使用jsonapi设计的Rails应用程序的基本示例_Ruby_Java.zip

    在这个基本示例中,我们将探讨如何在Ruby on Rails框架中实现JSONAPI,以及如何与Java客户端进行交互。 一、Ruby on Rails与JSONAPI Ruby on Rails 提供了强大的模型-视图-控制器(MVC)架构,使得开发RESTful API...

    ruby rails recipes

    在位表单编辑是一种用户友好的功能,允许用户直接在页面上修改数据而无需跳转到另一个表单页面。这种技术可以显著提升用户体验,特别是在管理大量列表数据时。实现这一功能通常需要结合 HTML、CSS 和 JavaScript ...

    Rails GUI Development with Ext JS 10-Jan-08 RUG-B.pdf

    Rails 是一个用于 Web 开发的模型-视图-控制器(MVC)框架,而 Ext JS 是一个功能丰富的 JavaScript 库,它提供了大量的用户界面组件。 #### 为什么选择 Ext JS? - **丰富组件库**:Ext JS 提供了大量的用户界面...

    RailsLite:Rails lite是轻量级的Rails克隆

    这是Rails Lite,它是一个项目,旨在向您展示Rails在幕后的工作方式。 要使用此项目,可以运行以下命令: Rubybin / basic_server.rb Rubybin / controller_server.rb Rubybin / params_server.rb Rubybin / ...

Global site tag (gtag.js) - Google Analytics