所以我在为移动客户端创建的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' }
答案 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文档