在Rails 5中,我使用form_for
帮助程序创建了一个用户注册页面,然后将其定向到我的自定义确认页面。
<%= form_for @user, url: {action: :confirm} do |f| %>
在我的确认控制器中,我可以毫无问题地访问参数。这是它们在控制台中的显示方式。
Parameters: {"utf8"=>"✓",
"authenticity_token"=>"<longBlaString>",
"user"=>{"name"=>"Railsmastanot",
"email"=>"example@domain.com",
"password"=>"[FILTERED]",
"password_confirmation"=>"[FILTERED]"},
"commit"=>"Sign up"}
然后我用
<%= button_to "Yes", {controller: "users", action: "create", params: params}, class: 'btn btn-success' %>
重定向到实际的users#create
方法。在里面我试图访问参数,例如params[:user][:email]
,但收到错误
没有将符号隐式转换为整数
检查控制台显示比我的参数哈希转为:
Parametes:
{"authenticity_token"=>"longBlaString",
"commit"=>"Sign up",
"user"=>"email=example@domain.com&name=Railsmastanot&password=
<myActualPassword!>&password_confirmation=<myActualPassword!>",
"utf8"=>"✓"}
因此用户密钥不再保留哈希值,而是字符串。这应该发生还是一个错误?如果不是bug,处理这个问题的正确方法是什么?我做错了吗?
编辑:
我发现params
实际上并不是Rails 5中的哈希。如果我传递像params: params.to_unsafe_h
这样的参数,它可以工作,但我不确定这是否安全。
答案 0 :(得分:2)
可以这样做
您使用的方法可能不安全,因为参数会打印在确认页面中。
答案 1 :(得分:0)
好的,我在这里得到了一个很好的答案,但它并没有真正回答发生了什么的问题。问题的根源在于Rails 5 params returns an object, not a hash。所以在Rails 5中实际上做params: params.to_unsafe_h
似乎相当于Rails 4中的params: params
。我被告知这样做只是因为Rails 5希望你知道你究竟是什么数据。重新传输,以免您不必要地无意中传输安全数据(例如,在不需要时传递整个用户对象)。它是Rails 4中已实现的Strong Parameters功能的扩展。
据我所知,在这种情况下,这并没有真正引入任何安全风险,因为params.to_unsafe_h
会立即转换回参数对象。
答案 2 :(得分:0)
除了接受的答案外,params.permit!
也可以解决问题。