我正在使用rails-api包构建一个restful Rails API,我似乎无法使用简单的CREATE来处理POST,因为传入的参数不包含在INSERT语句中。我可以从rails控制台创建记录。我已经检查过每一个明显的原因并且无法解决问题 - 社区的一些帮助将不胜感激。下面的相关代码以及测试用例和日志文件。
的routes.rb
MyApp::Application.routes.draw do
resources :people, except: [:new, :edit]
end
people_controller.rb
class PeopleController < ApplicationController
#POST/people
#POST/people.json
def create
@person = Person.new(params[:person])
if @person.save
render json: @person, status: :created location: @person
else
render json: @person.erros, status: :unprocessable_entity
end
end
型号:person.rb
class Person < ActiveRecord::Base
end
wrap_parameters.rb
这将允许客户端提交POST请求,而无需指定任何根元素。这是当前配置的,但代码在没有它的情况下也不起作用......
ActiveSupport.on_load(:action_controller) do
wrap_parameters format: [:json] if respond_to?(:wrap_parameters) end
使用Curl via Git Bash
在本地Windows环境中运行测试初始化本地rails服务器:rails s,打开GIT Bash并执行下面的CURL命令:
Curl -X POST -H "Content-TYPE: application/json" -d '{"first_name":"Michael", "last_name":"Foo", "email_address":"test", "password":"Foobar44"}' http://localhost:3000/people
卷曲响应输出:
{"id":9,"created_at":"2014-02-28T18:57:53.283z", "updated_at":"2014-02-28T18:57:53.283z","first_name":null,"last_name":null,"email_address":null, "password":null}
WEBrick日志输出
Started POST "/people" for 127.0.0.1
ActiveRecord::SchemaMigration Load [SELECT "schema_migrations".*FROM "schema_migrations"]
Processing by PeopleController#create as */*
Parameters: {"first_name"=>"Michael", "last_name"=>"Foo", "email_address"=>"test", "password"=>"Foobar44"}
[INSERT INTO "people" ("created_at", "updated_at") VALUES ($1, $2)
RETURNING ...
Completed 201 Created in 55ms
答案 0 :(得分:1)
看起来您正在使用强参数(rails 4的默认行为)
在您的控制器中尝试:
@person = Person.new(person_params)
然后在同一控制器中添加受保护的方法
protected
def person_params
params.require(:person).permit(:first_name, :last_name, :email_address, :password)
end
答案 1 :(得分:0)
已解决的问题:Sergey K.,通过Odesk解决了我的问题。
您是否在项目中使用rails 4?因为在轨道4中你无法做到
Person.create(PARAMS [:人])
因为它会引发ActiveModel :: ForbiddenAttributes异常。
您需要创建私有方法并明确告诉rails您允许和要求的属性:
私人 def person_params params.required(:person).permit(:name,:age) 端
然后执行:
Person.create(person_params)
您可以在此处详细了解strong_parameters和质量指配保护: https://github.com/rails/strong_parameters