Ruby on rails 需要旧密码才能创建新密码

Ruby on rails 需要旧密码才能创建新密码,ruby-on-rails,passwords,form-for,Ruby On Rails,Passwords,Form For,现在,每次我在user/edit中更改任何内容时,表单都要求用户设置新密码。我希望它只在输入新密码时才要求输入当前密码(我如何才能要求输入当前密码?)。我怎样才能做到这一点,非常感谢 <%= form_for(@user, :html => {:multipart => true}) do |f| %> <%= render 'shared/error_messages', object: f.object %> <%= f.text_field

现在,每次我在user/edit中更改任何内容时,表单都要求用户设置新密码。我希望它只在输入新密码时才要求输入当前密码(我如何才能要求输入当前密码?)。我怎样才能做到这一点,非常感谢

<%= form_for(@user, :html => {:multipart => true}) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <%= f.text_field :name, placeholder: :name %>
  <%= f.text_field :email, placeholder: :email %>
  <%= f.password_field :password, placeholder: "Enter new password" %>
  <%= f.password_field :password_confirmation, placeholder: "Confirm new password" %>
  <%= f.submit "Save changes", class: "btn btn-large btn-primary" %>
<% end %>
{:multipart=>true})do | f |%>

您可以创建一个单独的表单来更改密码。您可以像请求新密码一样请求当前密码:

<%= form_for(@user, :html => {:multipart => true}) do |f| %>
  <%= f.password_field :password, placeholder: "Enter current password" %>
  <%= f.password_field :password, placeholder: "Enter new password" %>
  <%= f.password_field :password_confirmation, placeholder: "Confirm new password" %>
  <%= f.submit "Save changes", class: "btn btn-large btn-primary" %>
<% end %>
{:multipart=>true})do | f |%>

您可以在表单中添加旧密码字段

<%= f.password_field :old_password, placeholder: "Enter current password" %>

我建议在您的用户\u控制器中进行额外的编辑\u密码和更新\u密码操作:

@user = User.find(params[:id])
user = User.find_by_email(current_user.email).try(:authenticate, params[:current_password])
if user && @user.update_attributes(params[:user])
  flash[:success] = "Password updated!"
  (sign_in @user)
  redirect_to ...
def update
  @user = User.find(params[:id])
  user = User.find_by_email(current_user.email).try(:authenticate, params[:current_password])
  if user && @user.update_attributes(params[:user])
    flash[:success] = "Profile updated"
    sign_in @user
    redirect_to @user
  else
    flash.now[:error] = "Incorrect Current Password" unless user
    sign_in @user
    render 'edit'
  end
end
在表单中,只需使用以下字段:

  <%= label_tag :current_password, "Current password:" %>
  <%= password_field_tag :current_password, params[:current_password] %>

  <%= form.label :password, "New password:" %>
  <%= form.password_field :password %>

  <%= form.label :password_confirmation, "Confirm new password" %>
  <%= form.password_field :password_confirmation %>

使用rails和web提供的一些信息,我想出了以下解决方案

用户/编辑视图:

<%= form_for(@user, :html => {:multipart => true}) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <%= f.text_field :name, placeholder: :name %>
  <%= f.text_field :email, placeholder: :email %>
  <%= password_field_tag :current_password, params[:current_password], placeholder: "Current password" %>
  <%= f.password_field :password, placeholder: "New password (optional)" %>
  <%= f.password_field :password_confirmation, placeholder: "Confirm new password" %>
<% end %>
用户控制器:

@user = User.find(params[:id])
user = User.find_by_email(current_user.email).try(:authenticate, params[:current_password])
if user && @user.update_attributes(params[:user])
  flash[:success] = "Password updated!"
  (sign_in @user)
  redirect_to ...
def update
  @user = User.find(params[:id])
  user = User.find_by_email(current_user.email).try(:authenticate, params[:current_password])
  if user && @user.update_attributes(params[:user])
    flash[:success] = "Profile updated"
    sign_in @user
    redirect_to @user
  else
    flash.now[:error] = "Incorrect Current Password" unless user
    sign_in @user
    render 'edit'
  end
end

我不知道它有什么帮助?我想我应该在用户模型中使用attr访问?仍然未知的属性。我不需要一种验证旧密码的方法吗。类似于“有意义吗?”的东西添加到模型中的attr_可访问列表中:old_password,然后它将作为模型中的属性可用,您可以验证它是否有意义?在我看来,它没有任何意义get-ActiveRecord::UnknownAttributeError in UsersController更新:old\u密码您必须添加attr\u访问器:old\u密码到,我的错误当我输入当前密码不正确时,我没有收到来自呈现“共享/错误消息”的任何错误消息,对象:f.object这是真的,您可以使用flash手动执行此操作[:error]=“是的,刚刚完成了,必须是flash。现在,它只保留在当前页面上