将before_filter更改为不需要密码进行配置文件编辑

时间:2012-04-17 15:49:01

标签: ruby-on-rails

如果我想让登录用户在他们的编辑页面上更改个人资料信息,而不是像他们目前那样输入他们的密码,我怎么能在UsersController中有效地改变它?

UsersController:

    before_filter :authenticate, :except => [:show, :new, :create]
    before_filter :authenticate, :only => [:index, :edit, :update, :destroy]
    before_filter :correct_user, :only => [:edit, :update]
    before_filter :admin_user,   :only => :destroy



    def edit
       @title = "Edit user"
    end

    def update
       @user = User.find(params[:id])
        if @user.update_attributes(params[:user])
          flash[:success] = "Profile updated."
          redirect_to @user
      else
      @title = "Edit user"
      render 'edit'
   end
 end

编辑页面

     </div>
     <h1> Confirm Password</h1><br /><br />
      <div class="field">
        <%= f.label :password, "Enter Password" %>&nbsp;&nbsp;&nbsp;&nbsp;
        <%= f.password_field :password %>
    </div>
    <div class="field">
       <%= f.label :password_confirmation, "Confirm Password" %>&nbsp;&nbsp;&nbsp;
       <%= f.password_field :password_confirmation %>
   </div>
   <div class="actions">
      <%= f.submit "Submit" %>
   </div>
   <% end %>
   </div>

3 个答案:

答案 0 :(得分:0)

我不明白你的问题。如果您在登录时验证其用户名和密码,则无需重新输入密码即可编辑其个人资料页面。登录后,它应该保持不变。您使用的是任何身份验证宝石吗?

答案 1 :(得分:0)

如果你使用的是设计宝石,请将它放在你的用户模型中:

def update_with_password(params={})
  if current_user && self.password.blank?
    false
    if params[:password].blank?
      params.delete(:password)
      params.delete(:password_confirmation) if params[:password_confirmation].blank?
    end
  else
    super
  end
end

答案 2 :(得分:0)

以下是我现在正在进行的项目中的工作方式:

用户模型

validates :password, :length => { :minimum => 8, :maximum => 20}, :unless => Proc.new { |u| u.password_optional? or u.password.blank? }
  validates :password, :confirmation => true, :unless => Proc.new { |u| u.password_optional? }

此方法取决于您拥有的密码逻辑......但我的看起来像这样:

def password_optional?
    optional = (encrypted_password.present? && password.blank? && password_changing.blank?)
    optional
  end

用户控制器 在您希望密码为可选的任何操作中,请执行以下操作: (假设你有一个@user对象......)

@user.password_optional = true

我认为这将在您的更新操作中。