我目前正在为一个朋友建立一个小型网站,我希望他能够更改他的密码,因为他将获得的密码是从Git存储库中播种并可见的(不用担心,他很好知道这是他必须改变的第一件事)
我一般都习惯于Ruby on Rails,但这对我来说是第一次使用API而不是Rails的“标准”版本,并且我对令牌和标记的使用一无所知这样的。
在后台,他可以更改网站上的某些元素,我制作了一个特定页面,他可以在其中更改一些详细信息,例如他的传记,个人资料图片,社交网络链接等。在此页面上,我在字段current_password
,password
和password_confirmation
中添加了可以更改密码的部分。我也开始设置一些验证,但是问题是,如果我在字段中键入3次“ password”,则会出现以下错误:
ActiveRecord :: RecordInvalid |验证失败:密码不能为空
困扰我的是两个因素:第一个是错误不是作为JSON返回,而是作为HTML返回(这是我的第一个问题,如何将格式强制为JSON?),并且确保密码已发送到API(前面是VueJS,但这不是问题),但仍然显示错误。
这是我的代码:
users_controller.rb
# ...
wrap_parameters :user, include: %i[password password_confirmatioon current_password]
# ...
def profile
if @user.update(user_params)
render json: @user, status: :ok
else
render json: @user.errors, status: :unprocessable_entity
end
@user.reset_password!(user_params[:new_password])
end
user.rb
class User < ApplicationRecord
mount_base64_uploader :picture, BioFaceUploader
include ActiveModel::Serializers::JSON
has_secure_password
attr_accessor :old_password
attr_accessor :profile
def generate_password_token!
begin
self.reset_password_token = SecureRandom.urlsafe_base64
end while User.exists?(reset_password_token: reset_password_token)
self.reset_password_token_expires_at = 1.day.from_now
save!
end
def reset_password!(password)
self.reset_password_token = nil
self.password = password
save!
end
def clear_password_token!
self.reset_password_token = nil
self.reset_password_token_expires_at = nil
save!
end
end
**编辑:这是我尝试发布新密码时的服务器日志输入**
Started POST "/profile" for 127.0.0.1 at 2018-09-21 13:15:33 +0200
Processing by UsersController#profile as HTML
Parameters: {"id"=>1, "email"=>"email@email.me", "password_digest"=>"[FILTERED]", [some more unrelated datas], "created_at"=>"2018-09-17T11:38:27.464Z", "updated_at"=>"2018-09-21T10:23:50.233Z", "reset_password_token"=>"[FILTERED]", "reset_password_token_expires_at"=>"[FILTERED]", "password"=>"[FILTERED]", "current_password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "user"=>{"password"=>"[FILTERED]", "current_password"=>"[FILTERED]"}}
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]]
↳ app/controllers/users_controller.rb:39
Unpermitted parameters: :password, :current_password
Unpermitted parameters: :password, :current_password
(0.1ms) begin transaction
↳ app/controllers/users_controller.rb:27
(0.1ms) commit transaction
↳ app/controllers/users_controller.rb:27
Unpermitted parameters: :password, :current_password
(0.1ms) begin transaction
↳ app/models/user.rb:21
(0.1ms) rollback transaction
↳ app/models/user.rb:21
Completed 500 Internal Server Error in 32ms (Views: 0.6ms | ActiveRecord: 1.5ms)
如您所见,2个字段未经授权,我将它们添加到允许的参数中,但是现在出现以下错误:
用户的未知属性“ current_password”
我应该将其添加到attr_accessor
的列表中吗?
该如何解决?
提前谢谢