传递params时,Rails 5将对象转换为字符串

时间:2017-03-31 16:05:59

标签: ruby-on-rails ruby ruby-on-rails-5

在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这样的参数,它可以工作,但我不确定这是否安全。

3 个答案:

答案 0 :(得分:2)

可以这样做

  1. 添加用户表
  2. 中确认的列
  3. 使用confirm =&gt;提交表单时保存用户虚假并从中获取身份。
  4. 然后从确认页面发送用户ID并确认。
  5. 如果确认信息,则用confirm = true更新用户。
  6. 如果信息未确认,则删除用户。
  7. 您使用的方法可能不安全,因为参数会打印在确认页面中。

答案 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!也可以解决问题。