Ruby on Rails - PUT方法创建额外的参数条目

时间:2015-04-23 02:55:14

标签: ruby-on-rails ruby put restful-architecture

所以我在为移动客户端创建的RESTful API实现端点时观察到了一些奇怪的行为。我正在使用PUT方法更新User模型上的属性。我将用户的id作为URL参数和要在JSON对象内更新的值发送。一切似乎工作得很好但是当我通过rails日志检查参数时,我发现了一些奇怪的东西。由于某种原因,有一个额外的参数发送到后端,我似乎无法解释。以下是我从移动客户端调用此端点时看到的日志:

Parameters: {"enable_security"=>true, "id"=>"7d7fec98-afba-4ca9-a102-d5d71e13f6ce", "user"=>{}}

从上面可以看出,附加的"user"=>{}被附加到参数条目列表中。当我打印出params对象时,我也看到了这一点。我似乎无法解释这是从哪里来的。我还检查了移动客户端只是为了安全,并且代码中没有我用密钥user发送参数的位置。这对我来说非常令人费解,让我觉得我错过了一些相当简单的东西。为什么有一个空对象,user密钥被发送到后端RESTful API?

更新以提供更多信息

以下是用户点击更新用户User模型的端点时调用的代码:

  #PUT /:id/user/update_security_settings
  def update_security_settings
    @user = User.find_by_id(params[:id])
    @user.advanced_security_enabled = params[:enable_security]

    respond_to do |format|
      if @user.save
        response = {:status => "200", :message => "User's security settings updated."}
        format.json { render json: response, status: :ok }
      else
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

响应用户评论时更新

以下是与user_controller相关的路由,视图控制器定义了处理创建和更新User模型的所有端点。

post '/user/upload_profile', to: 'user#upload_profile'
get '/:id/user', to: 'user#find_user'
put '/:id/user/update_security_settings', to: 'user#update_security_settings'
resources :user, :defaults => { :format => 'json' }

2 个答案:

答案 0 :(得分:3)

此评论是否真的反映了您的实际路线?

/user/:id/update_security_settings

我希望它是resources :user

你能告诉我们你的config / routes.rb - 我的猜测是你的路由以某种方式被配置为期望一个实际的嵌套用户参数,你不发送(当然)并且因此在日志。

更新: 你的一些路线很不寻常。您实际上不需要find_user路由,因为它应该在resource/:id/action下作为show action覆盖(前提是您在控制器中定义了show方法,这是检索单个资源项的默认方式;所以没有需要find_user)

对于像update_security_settings操作这样的自定义路由,我建议坚持默认模式,例如# notice that resources expects the plural form :users resources :users do member do patch :update_security_settings post :upload_profile # any other custom routes end end 并将其嵌套在默认的资源路由中。把id放在资源之前是非常不寻常的,令人困惑,实际上可能与你的问题有关(thoguh我不确定)。尝试清理你的路线.rb谎言:

GET /users

这会产生GET /users/1(索引),PATCH /users/1/update_security_settings(显示)和{{1}}等路线。

有关路由的更多信息,请访问:Rails Guides | Routing From The Outside In

请检查上述更改是否删除了空用户参数。

答案 1 :(得分:0)

中检查您的配置
config/initializers/wrap_parameters.rb

wrap_parameters format: []此列表不应包含json,然后它会将参数包装到所有json请求的控制器根目录。请参阅api文档