【问题标题】:Writing to Rails with a JSON API使用 JSON API 写入 Rails
【发布时间】:2013-07-17 19:50:57
【问题描述】:

几天来,我一直在尝试从POSTman 写一个普通的模型 Rails 应用程序,但不知道该怎么做,也找不到任何关于如何做的信息。

我的应用有一个带有名称字段的用户模型。我要做的就是使用 POSTman 通过 JSON 远程更改名称。

感谢任何有关如何执行此操作的帮助,包括指向如何执行此操作的基本资源的链接。

我想这是非常基本的。

编辑:这是 POSTman 输出的屏幕截图

编辑 2:

来自服务器日志:

Started PUT "/users/1.json" for 127.0.0.1 at 2013-07-17 16:53:36 -0400
Processing by UsersController#update as JSON
  Parameters: {"name"=>"Jeff", "id"=>"1"}
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", "1"]]
   (0.1ms)  begin transaction
   (0.1ms)  commit transaction
Completed 204 No Content in 3ms (ActiveRecord: 0.4ms)

事务正在发生,但实际上并未更新记录。我需要更改控制器中的某些内容吗?它只是一个常规的 rails 生成的控制器,没有任何变化。

编辑 3:

这是我刚刚转到http://localhost:3000/users/1.json的输出

{
"created_at": "2013-07-02T21:51:22Z",
"id": 1,
"name": "Arel",
"updated_at": "2013-07-02T21:51:22Z"
}

同样,我没有对脚手架进行任何更改,并且我无法弄清楚如何格式化 JSON 以将其嵌套在用户下,就像答案所暗示的那样。

这是我的控制器的相关部分:

# GET /users/1
  # GET /users/1.json
  def show
    @user = User.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @user }
    end
  end

# PUT /users/1
  # PUT /users/1.json
  def update
    @user = User.find(params[:id])

    respond_to do |format|
      if @user.update_attributes(params[:user])
        format.html { redirect_to @user, notice: 'User was successfully updated.' }
        format.json {  }
      else
        format.html { render action: "edit" }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

我不明白为什么这么难。我只是想通过 JSON 更新一个名称...

【问题讨论】:

  • 到底是什么问题?您是否在 rails 服务器日志中看到任何输出?
  • 它什么也不做。当我输入地址localhost:3000/users/1.json 并选择 PUT,键为名称,值为 Jeff 204 时,没有返回任何内容
  • @diego.greyrobot 我刚刚添加了我一直在尝试做的事情的屏幕截图。
  • 您可能在日志中看到了这一点,对吧? “警告:无法验证 CSRF 令牌的真实性”
  • 是的!如何仅针对 JSON 请求禁用此功能?

标签: ruby-on-rails json api


【解决方案1】:

对于您要发布到的控制器:

protect_from_forgery with: :null_session

或喜欢来自:How do I bypass protect_from_forgery in Rails 3 for a Facebook canvas app?

skip_before_filter :verify_authenticity_token, :only => [THE ACTION]

编辑

您的 JSON 不正确...您正在发布

{"name"=>"Jeff", "id"=>"1"}

由于您的控制器执行user.update_attribute(params[:user]),因此您的 JSON 需要在用户属性下

{
    "id": 1,
    "user": {
        "name": "Jeff"
    }
}

这将创建一个散列

{"user"=>{"name"=>"Jeff"}, "id"=>"1"}

【讨论】:

  • 所以现在它没有给出 CSRF 令牌错误,但在提交事务后仍然给出 204 no content 错误。我已经用完整的输出更新了我的问题。
  • 我完全迷路了。我一直在阅读 rails 文档,试图弄清楚如何按照您显示的方式格式化我的 JSON 输出,他们说输出应该已经是您的方式,并且只提供有关如何更改您的(正确)格式的说明到我不正确的格式。以下是文档:api.rubyonrails.org/classes/ActionController/ParamsWrapper.html 我还用我的输出和控制器更新了我的问题。
  • 输出无关。您正在发送输入。输入格式与输出格式不同。在邮递员中,将您的字段名称更改为“用户[名称]”
  • 成功了!!感谢你们对我的帮助!我真的很感激!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 2014-05-13
  • 2017-10-02
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多