我正在使用rails和devise。它接缝更新用户对象的唯一方法是通过表单。即使我使用控制台或保存(假),设计对象似乎不起作用。
除非用户点击显示更改密码的链接,否则我不想显示新密码和确认密码。然后,这会将用户的布尔值更改为true,然后重定向到用户页面,然后if / else / end显示适当的代码。
问题是第一个change_password确实已设置,但第二个不会更改它。疯狂。
模型
devise :registerable, :database_authenticatable, :recoverable,
:rememberable, :trackable, :validatable, :confirmable
# Setup accessible (or protected) attributes for your model
attr_accessible :email, :password, :password_confirmation, :name, :change_password
has_many :analytics
has_many :answers
before_save :change_password_to_false
def change_password_to_false
self.change_password = false
end
控制器
def change_password
player = Player.find(current_player.id)
player.change_password = true
player.save(false)
redirect_to edit_player_registration_path
end
def keep_password_the_same
player = Player.find(current_player.id)
player.change_password = false
player.save(false)
redirect_to edit_player_registration_path
end
视图
<% if current_player.change_password? %>
<h4><%= link_to "Keep Password The Same", keep_password_the_same_path %></h4>
<%= render 'change_password', :f => f %>
<% else %>
<h4><%= link_to "Change Password", change_password_path %></h4>
<% end %>
代码存在一些问题,但是codevoice能够让我朝着正确的方向前进。我认为save(false)也绕过了回调,但事实并非如此。因此,即使用户使用save(false)更新了用户,每次用户更新时,change_password
都会设置为false。
第二件事是让用户能够删除更改密码字段,如果他们决定不想更改密码字段。所以在回调中我只检查change_password
字段是否刚刚更改为true然后我什么也没做。如果密码已经为真且用户刚刚更新,那么您可以将其重置为false。
答案 0 :(得分:1)
我认为您的change_pasword
属性始终为false
,因为您使用before_save :change_password_to_false
。这意味着每次保存change_password
模型时,您都要将false
更改为Player