Rails Rest-Post Params hash not not written

时间:2015-08-03 15:37:59

标签: ruby-on-rails rest hash

我正在使用Rails构建我的第一个REST API,并且有一个我无法解决的简单问题。

基本上我无法从http PUSH请求中将params哈希写入数据库。

我在Api命名空间下面有以下用户控制器和create action。

class Api::UserController < ApplicationController
      http_basic_authenticate_with :name => "test", :password => "test"
      skip_before_action :verify_authenticity_token

      def create
             @user = User.create(params[:user])
              respond_to do |format|
                      if @user.save
                              format.json{render json: @user, status: :created, location: @user} #render create full response
                      else
                              format.json{render json: @user.errors, status: :unprocessable_entity}
                      end
              end
      end
end 

此操作的路径是

 POST    /api/user(.:format)    api/user#create{:format=>"json"}

用户模型的名称和地址字符串未包含。

要测试REST调用,请设置firefox插件RESTeasyRESTclient 使用此网址http://localhost:3000/api/user/

和这个身体     {         “名字”:“timoteo”,         “地址”:“柏林”     }

到目前为止一切顺利。现在发送这个包之后,Webrick给了我这个输出:

Started POST "/api/user" for ::1 at 2015-08-03 17:06:50 +0200
Processing by Api::UserController#create as JSON
 Parameters: {"name"=>"timoteo", "address"=>"berlin"}
  (1.2ms)  BEGIN
  SQL (0.6ms)  INSERT INTO "users" ("created_at", "updated_at") VALUES ($1, $2) RETURNING "id"  [["created_at", "2015-08-03 15:06:50.646169"], ["updated_at", "2015-08-03 15:06:50.646169"]]
  (42.8ms)  COMMIT
  (0.3ms)  BEGIN
  (0.3ms)  COMMIT
 Completed 201 Created in 66ms (Views: 1.4ms | ActiveRecord: 48.1ms)

忽略了这两个参数和一个像这样的空空记录存储在数据库中(REST客户端也向我显示了相同的内容)

{"id":19,"name":null,"address":null,"created_at":"2015-08-03T15:06:50.646Z","updated_at":"2015-08-03T15:06:50.646Z"}

有人可以给我一些暗示在途中可能出错的地方。我认为它是params hash的东西,但我还是想不通。

2 个答案:

答案 0 :(得分:1)

为您的模型添加验证:

class User < ActiveRecord::Base
   validates_presence_of :name
   validates_presence_of :address
end

这将禁止使用空白属性保存记录。

然后,将您的#save调用更改为控制器中的#persisted?(因为记录是在调用#create后立即创建的,它已经保存或失败了)

if @user.persisted?
  format.json{render json: @user, status: :created, location: @user} #render create full response
else
  format.json{render json: @user.errors, status: :unprocessable_entity}
end

<强> UPD 即可。您也可以从您接受的白名单参数中受益:

@user = User.create(params.require(:name, :address))

这样Rails会回复错误,说参数丢失,并且不会为用户分配任何其他属性(你不想分配)。

答案 1 :(得分:1)

当您的用户创建为{ "name": "timoteo", "address": "berlin" }

时,@user = User.create(params[:user])的参数不正确

你的params看起来更像是:{ "user": { "name": "timoteo", "address": "berlin" } },因为您正在访问params[:user],因此用户属性需要属于参数的用户部分。

添加验证可能会有所帮助,如果它不能保存没有名称/地址的用户。

class User < ActiveRecord::Base
  validates :name, presence: true
  validates :address, presence: true
  # etc...
end