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

时间:2014-06-04 23:51:40

标签: ruby-on-rails json postgresql ruby-on-rails-4

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

My API :: V1:UsersController继承自ActionController :: Base,并具有以下创建方法:

# 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 < / strong>(我使用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。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

json格式错误。试试这个:

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

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

Rails JSON request is not parsed correctly into post parameters

答案 1 :(得分:1)

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

wrap_parameters format: [:json, :xml]

这会将JSON参数嵌套在一个包装器哈希中,并附加一个&#34; name&#34;取控制器名称的键(根据Rails 4 API)。