我设置了这些方法来自动加密值。
当我试图提交表单并出现错误(缺少电话号码),则
HTML源代码
class User < ApplicationRecord
def name=(val)
super val.encrypt
end
def name
(super() || '').decrypt
end
当我试图提交表单并出现错误(缺少电话号码),则
name
属性显示为乱码。<input class="form-control" type="text" value="Mg8IS1LB2A1efAeZJxIDJMSroKcq6WueyY4ZiUX+hfI=" name="user[name]" id="user_name">
只有在验证成功时它才能正常工作。当我通过控制器#update
逐行执行代码时,它也可以在控制台中正常工作。
irb(main):015:0> u = User.find 1
irb(main):016:0> u.name
=> "Sue D. Nym"
irb(main):017:0> u.phone
=> "212-555-1234"
irb(main):018:0> u.update name: 'Sue D. Nym', phone: ''
(10.0ms) BEGIN
(1.0ms) ROLLBACK
=> false
irb(main):020:0> u.save
=> false
irb(main):029:0> u.errors.full_messages.join ','
=> "Phone can't be blank"
irb(main):031:0> u.build_image unless u.image
=> nil
irb(main):033:0> u.name
=> "Sue D. Nym"
users_controller.rb
def update
@user = User.find current_user.id
@user.update user_params
if @user.save
flash.notice = "Profile Saved"
redirect_to :dashboard
else
flash.now.alert = @user.errors.full_messages.join ', '
@user.build_image unless @user.image
render :edit
end
end
视图在经过验证失败后,以某种方式获取了加密值,而没有经过#name
。
我将控制器最小化,但在#update
之后立即失败。 然而,在控制台上它是有效的!
def update
@user = User.find current_user.id
@user.update user_params
render :edit
return
我将视图缩小到最小,显示了名称,但仅在form_for
之外。我还不知道原因。
edit.haml
=@user.name
=form_for @user, html: { multipart: true } do |f|
=f.text_field :name
HTML源代码
<span>Sue D. Nym</span>
<form class="edit_user" id="edit_user_1" enctype="multipart/form-data" action="/users/1" accept-charset="UTF-8" method="post">
<input name="utf8" type="hidden" value="✓"><input type="hidden" name="_method" value="patch"><input type="hidden" name="authenticity_token" value="C/ScTxfENNxCKgzG0qAlPElOKI7nOYxZimQ7BsB64wIWQ9El4+vOAfxX3qHL08rbr0sxRiJnzQti13e4DAgkfQ==">
<input type="text" value="sER9cjwa6Ov5weXjEQN2KJYoTOXtVBytpX/cI/aPrFs=" name="user[name]" id="user_name">
</form>
我注意到attributes
仍然返回加密的值,所以我尝试添加了这个代码,但是form_for
仍然能够获取加密的值并将其放入表单中!
def attributes
attr_hash = super()
attr_hash["name"] = name
attr_hash
end
Rails 5.0.2