我正在尝试在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
我不想输入密码。
答案 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。客户端可以轻松地处理成功消息。