设计报价逃逸JSON的消毒

时间:2015-01-04 01:11:09

标签: ruby-on-rails json devise

我有一个使用Devise Authentication运行的Rails 4.0服务器。我将我的Devise控制器设置为接受JSON。当我从浏览器发出AJAX请求以注册新用户时,一切正常。这种情况下的参数如下:

{"user"=>{"username"=>"Firstuser", "email"=>"theuser@email.com", "password"=>"mysecret",   "password_confirmation"=>"mysecret"}}

BUT!当我尝试提交看起来像这样的参数时:

{"user"=>"{\"username\":\"Seconduser\",\"email\":\"user2@email.com\",\"password\":\"mysecret\",\"password_confirmation\":\"mysecret\"}"}

我明白了:

NoMethodError - undefined method `permit' for #<String:0x007f9183dc1290>:

在我的服务器日志中。我的应用程序控制器的参数清理设置如下:

def configure_permitted_parameters      
  devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :email, :password, :password_confirmation) }      
end

任何人都知道我应该从这里做什么?我不确定在Devise管道中我可能需要使用JSON.parse(params), IF 甚至可以使用

谢谢您的任何见解!!!

1 个答案:

答案 0 :(得分:0)

好。我想到了: 当第一种方式提交时,我试图清理的对象和configure_permitted_pa​​rameters的类型为ActionController :: Parameters。但是,当以第二种方式提交时,该对象是一个没有'permit'方法的字符串(ActionController :: Parameters确实如此)。

我基本上必须检查是什么类型的参数:

def configure_permitted_parameters     
  devise_parameter_sanitizer.for(:sign_up) do |u|
    if u.class == String
      u = ActionController::Parameters.new(JSON.parse(u))
    end

    u.permit(:username, :email, :password, :password_confirmation)
  end
end