更新没有表单的设备对象,Rails

时间:2010-12-24 19:03:39

标签: ruby-on-rails devise

我正在使用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。

1 个答案:

答案 0 :(得分:1)

我认为您的change_pasword属性始终为false,因为您使用before_save :change_password_to_false。这意味着每次保存change_password模型时,您都要将false更改为Player