为什么我的Rails API不能保存数据库中的任何内容?

我正在构建一个带有Rails 4.1的应用程序,它有一个用户控制器和一个单独的API控制器,用于在/v1/users获取和发布基本用户数据(将在生产中的专用子域中提供)。

我的API :: V1:UsersControllerinheritance自ActionController :: Base,并具有以下create方法:

 # POST /v1/users def create @user = User.create(params[:user]) if @user.save render :json => @user else render :json => { :errors => @user.errors.full_messages }, :status => 422 end end 

在我的主UsersController中,create方法如下所示:

 def create @user = User.new(user_params) @user.save redirect_to @user end private def user_params params.require(:user).permit(:first_name, :last_name, :email, :birthdate) end 

…而routes.rb将所有内容联系起来:

 namespace :api, :path => "/", defaults: { format: 'json' } do namespace :v1 do resources :users end end resources :users 

但是,当我尝试通过curl或其他脚本发送到http://localhost/v1/users ,使用Content-Type:application / json时,新的用户对象以JSON格式返回,但没有任何内容保存到Postgres (我’ m使用UUID作为users表的主键)。 创建了用户记录,但除了时间戳之外,哈希是完全空的:

 { "id": "c63b559d-edf3-454d-bcb7-a0b8e5c04c10", "first_name": null, "last_name": null, "email": null, "birthdate": null, "created_at": "2014-06-04T23:45:15.046Z", "updated_at": "2014-06-04T23:45:15.046Z" } 

我在developer.log中的控制台输出如下所示:

 Started POST "/v1/users" for 127.0.0.1 at 2014-06-04 19:32:28 -0400 Processing by API::V1::UsersController#create as JSON Parameters: {"{ \"email\": \"test@example.com\" }"=>nil} [1m[36m (0.1ms)[0m [1mBEGIN[0m [1m[35mSQL (0.3ms)[0m INSERT INTO "users" ("created_at", "updated_at") VALUES ($1, $2) RETURNING "id" [["created_at", "2014-06-04 23:32:28.105402"], ["updated_at", "2014-06-04 23:32:28.105402"]] [1m[36m (0.9ms)[0m [1mCOMMIT[0m [1m[35m (0.1ms)[0m BEGIN [1m[36m (0.1ms)[0m [1mCOMMIT[0m Completed 200 OK in 3ms (Views: 0.2ms | ActiveRecord: 1.4ms) 

这里有什么我想念的吗? 看起来这些参数甚至没有被create方法接收,并且它们肯定没有进入psql。 任何帮助,将不胜感激!

json格式错误。 试试这个:

 {"user":{ "first_name": "string", "last_name": "string", "email": "string", "birthdate": "string", }} 

只要params.require(:user)期望对象名称。

Rails JSON请求未正确解析为post参数

另一种解决方案是在API用户控制器(或基类)的顶部添加以下行:

 wrap_parameters format: [:json, :xml] 

这将JSON参数嵌套在包装器哈希中,并带有一个额外的“name”键,该键带有控制器的名称(根据Rails 4 API )。