如何在Ruby on Rails中编写PATCH端点

时间:2014-09-08 04:00:02

标签: ruby ruby-on-rails-4 rails-api

我正在尝试在ROR中编写一个简单的PATCH端点来更新用户。这就是我所拥有的:

  def update
    @user = User.find(params[:id])
    if @user.update_attributes(name: params[:name],
                          username: params[:username],
                          email: params[:email],
                          bio: params[:bio])
      render json: {
        message: 'User Updated Successfully',
        id: @user.id,
        name: @user.name,
        username: @user.username,
        email: @user.email,
        bio: @user.bio
      }, status: 200
    else
      render json: {
        message: 'Validation Failed',
        errors: @user.errors.full_messages
      }, status: 422
    end
  end

    def user_params
      {
        device_token: params[:device_token],
        id: params[:id],
        name: params[:name],
        username: params[:username],
        email: params[:email],
        bio: params[:bio], 
        password: params[:password],
        password_confirmation: params[:password_confirmation]
      }
    end

更新方法未通过'if'并将422返回给我的客户端。我不太确定我做错了什么。我认为,因为在创建用户时需要密码/确认,所以它失败了,因为它们没有在此方法的参数中提供。我完全不在基地吗?如果没有,有什么方法围绕这个障碍?提前谢谢。

------ -------编辑

从rails控制台

[3] pry(main)> @user.update_attributes({'name' => 'Jason Smith', 'username' => 'smithja', 'email' => 'jason.a.smith@vanderbilt.com', 'bio' => ''})
   (0.2ms)  BEGIN
  User Exists (0.9ms)  SELECT  1 AS one FROM "users"  WHERE (LOWER("users"."email") = LOWER('jason.a.smith@vanderbilt.com') AND "users"."id" != 14) LIMIT 1
   (0.3ms)  ROLLBACK
=> false

[4] pry(main)> @user.update_attributes({'name' => 'Jason Smith', 'username' => 'smithja', 'email' => 'jason.a.smith@vanderbilt.com', 'bio' => '', 'password' => 'foobar', 'password_confirmation' => 'foobar'})
   (0.2ms)  BEGIN
  User Exists (0.5ms)  SELECT  1 AS one FROM "users"  WHERE (LOWER("users"."email") = LOWER('jason.a.smith@vanderbilt.com') AND "users"."id" != 14) LIMIT 1
  SQL (0.5ms)  UPDATE "users" SET "bio" = $1, "email" = $2, "name" = $3, "password_digest" = $4, "updated_at" = $5, "username" = $6 WHERE "users"."id" = 14  [["bio", ""], ["email", "jason.a.smith@vanderbilt.com"], ["name", "Jason Smith"], ["password_digest", "$2a$10$XvOv1EchEeWAEczbKKTbC.l5svoSTA807Y0dgOMFOh3xUi5uC.vaW"], ["updated_at", "2014-09-08 17:39:50.240324"], ["username", "smithja"]]
   (0.5ms)  COMMIT
=> true

我不想输入密码。

1 个答案:

答案 0 :(得分:1)

是的422是验证失败的时候。将您的验证更新为仅需要密码&在create上的password_confirmation。如果您使用的是has_secure_password,则应该为您执行此操作。

此外,无需手动构建您的JSON:

render @user.as_json.merge({:message => 'User Updated Successfully'}).to_json

as_json方法将其转换为哈希对象,可用于创建json字符串。这默认包括所有数据库属性。然后to_json获取修改后的哈希并返回字符串值。

虽然老实说,我只会将消息传递回服务器需要确定的JSON。因此,例如对于格式错误的电子邮件的错误消息非常适合传递JSON。客户端可以轻松地处理成功消息。