2015-04-23 67 views
2

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

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' } 
+1

您可以发布您提交的表单吗?如果我没有弄错,我可以在那里存在User.new。 – coderhs

+0

RESTFul api没有任何形式。我可以发布终端命中时调用的代码吗?这是你的意思吗? @Coderhs – ScottOBot

回答

3

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

#PUT /:id/user/update_security_settings

我希望它是/user/:id/update_security_settings代替。

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

更新: 您的一些路线是不寻常的。您实际上不需要find_user路由,因为它应该在resources :user中作为show动作(如果您在控制器中定义了show方法,这是检索单个资源项的缺省方式;因此不需要find_user)

对于像update_security_settings动作的自定义路由,我建议坚持默认模式,如resource/:id/action并将其嵌套在默认的足迹路由中。将资源标识放在资源之前非常不寻常,令人困惑,并且实际上可能与您的问题有关(我不确定这一点)。尝试清理您的routes.rb liek这样的:

# 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 

这会导致类似GET /users(指数)的路线,GET /users/1(显示)和PATCH /users/1/update_security_settings

更多关于路由的在这里找到:Rails Guides | Routing From The Outside In

请检查上面的变化删除您空的用户PARAM。

+0

嘿@thirdsun我发布了与有问题的控制器相关的路由。我很抱歉,如果我的URL有点不合常规,我没有使用Ruby on Rails进行任何正式培训,也不了解许多常见的编码约定和最佳实践。 – ScottOBot

+0

@ScottOBot谢谢,我更新了我的答案。再次,我的猜测是,不寻常的路线设计(如:用户之前的id)引入了意想不到的/奇怪的参数。 – thirdsun

0

检查配置在

config/initializers/wrap_parameters.rb 

wrap_parameters format: []此列表中不应包含JSON然后将包装参数的你的根控制器的所有JSON请求。请参阅api文档