Rails-api:忽略参数并使用Null值创建新记录

时间:2014-02-28 19:23:47

标签: ruby-on-rails rails-activerecord

我正在使用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

2 个答案:

答案 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