我正在使用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。任何帮助将不胜感激!
答案 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)。