【问题标题】:Using curl to test Rails routes使用 curl 测试 Rails 路由
【发布时间】:2011-09-09 13:17:21
【问题描述】:

我有一个名为 users 的模型,我想使用 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>
.
.
.

这是 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

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

【问题讨论】:

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


    【解决方案1】:

    您的PUT 数据应如下所示:

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

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

    【讨论】:

    • 抱歉 - 我刚刚查看了您的控制器代码。由于您有params[:user][:attribute1] 等,因此您的属性实际上需要包装在用户[...] 中。请查看我的更新回复。
    【解决方案2】:

    调用 curl 时,您必须像这样发送属性:user[name]=John&... 你这样做了吗?

    【讨论】:

    • 不,我没有 - 这消除了错误消息,但用户信息没有得到更新。
    • 另外,你必须在没有用户命名空间的情况下设置 id,所以 id=15&user[name]=john&... 另外,rails 可能没有正确接收 http 动词,尝试使用附加参数 _method=put 的发布请求
    • 所以我尝试了curl -X POST -d "_method=PUT&amp;id=1&amp;user[attr1]=val1&amp;user[attr2]=val2" http://localhost:3000/users/1,但它仍然没有更新。我也试过curl H "X-HTTP-Method-Overrride: PUT" -X POST -d "id=1&amp;user[attr1]=val1&amp;user[attr2]=val2" http://localhost:3000/users/1,这给了我一个错误,说 /users/1 没有路由
    • 对 users/{id} 的 PUT 请求不会和在数据部分中说 id=1 一样吗?
    猜你喜欢
    • 2015-11-11
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多