使用curl测试Rails路由

时间:2011-06-06 19:10:22

标签: ruby-on-rails ruby-on-rails-3 api curl routes

我有一个名为用户的模型,我想使用API​​进行更新。我想这样做的方法是创建一个更新路由并插入执行更新的代码。我使用RSpec创建了一个测试,它似乎工作,但是,我想实际看到我的数据库中更改的数据,所以我试图使用curl来更新我的开发数据库。

我尝试了命令

curl -X PUT -d "attribute1 = value1, attribute2 = value2" http://localhost:3000/users/1

但我收到了错误

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Action Controller: Exception caught</title>
<style>
.
.
.
</style>
</head>
<body>

<h1>
NoMethodError
in UsersController#update
</h1>
<pre>You have a nil object when you didn't expect it! You might have expected an    instance of ActiveRecord::Base. The error occurred while evaluating nil.[]</pre>
.
.
.

Heres是routes.rb中的相关行

resources :users, :only => [:create, :update, :destroy]

这是控制器中的相关代码

def update
  @user = User.find(params[:id])

  if params[:user][:attribute1] == ("x" || "y" || "z")
      params[:user][:attribute3] = Time.now
  end

  @user.update_attributes(:user)

  render :nothing => true
end

最后这是传递的规范代码

describe "PUT 'update'" do
  before(:each) do
      @user = Factory(:user)
  end

  describe "success" do

      it "should be successful" do
          put :update, :id => @user, :user => { :attribute1 => "x", :attribute2 => "xyz"}
          response.should be_success
      end

      it "should update attribute" do
          old_attribute = @user.attribute3
          put :update, :id => @user, :user => { :attribute1 => "x", :attribute2 => "xyz"}
          @user.attribute3 != old_attribute
      end

  end
end

我试图找一个好的卷曲教程来检查我的语法,但我只能找到例子,所以我不太确定语法是否正确。

2 个答案:

答案 0 :(得分:2)

您的PUT数据应如下所示:

user[attribute1]=value1&user[attribute2]=value2

类似于在URL的查询字符串上构造参数的方式。

答案 1 :(得分:1)

调用curl时,您必须发送如下属性:user [name] = John&amp; ... 你做到了吗?