(这与日志文件中的过滤参数无关。)
在我看来,我有
<%= password_field_tag:password,'',autofocus:true,class:'form-control'%>
然后在我的控制器中
@password = params [:密码]
在Rails 4中,我可以使用@password进行身份验证,一切正常。
在Rails 5中,params不再包含:password。如果我在视图和控制器中更改:密码为:password1,一切都很好,所以不知何故:密码被过滤掉了。
我检查了config.filter_parameters(它控制日志文件过滤) - 从中删除了'密码',但它没有影响这种行为。
我错过了什么?
可能不是OP的情况,但这表明我将应用程序移植到Rails 5
当参数传递到根级别的操作而不是作用域时,可能会发生这种情况:例如,对于用户注册:
params: { email: "[email protected]", password: "passw0rd" }
Rails(至少5个)参数包装器在'user'键下创建'magic'嵌套参数(来自控制器名称),所以当它到达你的控制器动作时,这实际上是现有的:
params: { email: "[email protected]", password: "passw0rd", user: { email: "[email protected]"} }
请注意,电子邮件值已复制到用户密钥下方!感觉就像WTF,但我确信有充分的理由这样做。它发生在/actionpack-5.2.2.1/lib/action_controller/metal/params_wrapper.rb#250
期间的process_action
但鉴于这样做,可能是一个错误,密码也不会被复制。但这被request.filteres_parameters.slice(*wrapped_keys)
过滤掉了
因此,故事的寓意是,在模型名称下嵌套你的形式参数。
我认为OP看到错误的原因是使用了password_field_tag,它可能在:user namespace key之外创建一个:password param
params: { :password => "passw0rd" }
而不是
params: { :user => { :password => "passw0rd" } }
控制器可能正在寻找:user ..:password(如果正在使用强params)
之所以没有表现为其他表单字段的明显问题是因为参数包装正在将所有其他表单字段复制到params [:user]
精神注意,密码的过滤可能基于日志过滤配置?