大家都知道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
然后就上演了一出反复调试的悲剧...
撰文记之,告诫一下自己要注意细节.
分享到:
相关推荐
所以 Model 中需要列一个白名单,声明哪些属性可以被 parameter 的数据更新。 Rails 3 # kings_controller.rb def create #{ name: ‘David', sex:male, age: 31} @king = King.new(params[:king]) if @king....
安装将此行添加到您的应用程序的Gemfile : gem 'params_for' 然后执行: $ bundle或者自己安装: $ gem install params_for用法在您的控制器中: # app/controllers/fancy_controller.rbclass FancyController <...
Draper向Rails应用程序中添加了一个面向对象的表示逻辑层。 如果没有Draper,则此功能可能已在过程帮助器中纠结在一起或为模型增加了体积。 借助Draper装饰器,您可以使用与演示文稿相关的逻辑包装模型,以更有效...
这是Rails Lite,它是一个项目,旨在向您展示Rails在幕后的工作方式。 要使用此项目,可以运行以下命令: Rubybin / basic_server.rb Rubybin / controller_server.rb Rubybin / params_server.rb Rubybin / ...
该插件在ActiveController::Base上提供了两个类方法,用于过滤该控制器操作的params哈希值。 您可以将它们视为attr_protected和attr_accessible的控制器类似物。 安装 Rails的2.3.x版本 gem install param_...
action_args是一个Rails插件,它扩展了控制器的操作方法,使您可以在任何操作的方法定义中指定感兴趣的参数。 -简而言之,这使您的Rails控制器变得轻浮。控制器具有以下控制器代码: class UsersController < ...
Rescue-Dog在引发Rails异常时会响应HTTP状态(代码和消息)。 安装 将“救援犬” gem添加到您的Gemfile gem 'rescue-dog' 并运行bundle install命令。 声明CRUD动作 包括Rescue::Controller (Rescue :: ...
要在 Rails 3 应用程序中使用ParamsPatrol , 在模型级别包括 include ActiveModel :: SuppressForbiddenAttributes 并在控制器级别包括 include ActionController :: HandleUnpermittedParameters ` 还需要设置强...
将秘密令牌保留在您的代码之外ENV变量是一个好习惯 原因:您不希望您的版本控制主机、CI 提供程序或任何其他可以访问您的代码的服务访问您的机密。 如果其中一项服务遭到破坏,或者其中一项服务的单个开发人员帐户...
包括SamlIdp::Controller并查看使用rails的示例。 对您来说应该很简单。 基本上,您对传入的请求调用decode_request(params[:SAMLRequest]) ,然后使用值saml_acs_url确定需要认证用户的来源。 您如何验证用户身份...
有时我们会遇到这样的场景:在不同的控制器中,我们需要为模型使用相同的允许属性,并最终再次重写所有属性(违反DRY)。 许可证旨在: 在不同的位置/控制器上重复使用相同的允许属性。 范围允许的属性基于角色,...
使用在Ruby on Rails中构建的演示聊天Web应用程序。 该演示位于: : 目录 建立讯息 当消息表单提交到POST /rooms/1/messages端点时, 控制器动作 # app/controllers/messages_controller.rb class Messages...
上一次超时时,我们创建了一个PostSerializer并用它来将Post序列化为JSON。 它的工作效果很好,但是进行所有字符串连接并跟踪不同的引号真是一场噩梦。 想象一下,必须为具有四个以上字段的对象手动编写序列化器! ...
安装将此行添加到您的应用程序的Gemfile中: gem 'delivery_boy' 然后执行: $ bundle或将其自己安装为: $ gem install delivery_boy用法一旦 ,并假设您的Kafka代理在本地主机上运行,您就可以直接从Rails代码...
当我们想要查看一个Post的实例时,我们还想要查看与该Post关联的Author 。 我们可以使用内置的ActiveRecord方法to_json手动嵌套数据,以一种to_json方式序列化此数据。 看一下它的当前实现: # posts_controller....
# Example useage in a rails controller action # GET /posts?period=2015-08 def index date_range = DatePeriodParser . range ( params [ "period" ] , default : "today" ) @posts = Posts . where ( ...