【问题标题】:Why isn't my Rails API saving anything to the database?为什么我的 Rails API 没有将任何内容保存到数据库中?
【发布时间】:2014-06-04 23:51:39
【问题描述】:

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

我的 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

在我的主用户控制器中,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 或其他脚本 POST 到 http://localhost/v1/users,使用 Content-Type: application/json 时,新的用户对象以 JSON 格式返回,但 没有任何内容保存到 Postgres (我使用 UUID 作为用户表的主键)。创建了用户记录,但哈希完全为空,保存时间戳:

{
    "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"
}

我在 development.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。任何帮助将不胜感激!

【问题讨论】:

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


    【解决方案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

    【讨论】:

    • 好的---谢谢!还必须通过 user_params 显式允许变量以防止 Forbidden Attributes 异常:params.require(:user).permit(:first_name, :last_name, :email, :birthdate)
    【解决方案2】:

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

    wrap_parameters format: [:json, :xml]
    

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

    【讨论】:

      猜你喜欢
      • 2011-07-19
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 2021-11-09
      • 2016-10-21
      相关资源
      最近更新 更多