2012-05-11 7 views
3

私のユーザーモデルにedit_profileという新しいページを作成して、ユーザーがプロフィール(文字列)を編集できるようにしようとしています。私はここでパスワードを入力せずにユーザープロファイルを更新し、毎回確認します。

http://railscasts.com/episodes/41-conditional-validationsを次の形式(edit_profile.html.erb)ですよ:

<%= form_for @user, :html => { :multipart => true } do |f| %> 

    <div class="field"> 
    <%= f.label :profile %><br/> 
    <%= f.text_area :profile, :class => "round" %><br /> 
    </div> 

    <div class="actions"> 
    <%= submit_tag "update", :id => "updateSubmit" %> 
    </div> 
<% end %> 

私がいる問題は、私は、パスワードとパスワードの確認の有無の検証を持っているということです。 edit_profileビューを読み込むと、新しいプロファイルを送信しようとしても、このメッセージが表示され続けます。Password is too short (minimum is 6 characters)ここで

は私users_controller.rbです:

def edit_profile 
    @user = current_user 
    @user.updating_password = false 
    @user.save 
    @title = "Edit profile" 
end 

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

私は、ユーザーモデルで私のプロファイル属性を編集したいとき、私は自分のパスワード検証をバイパスするにはどうすればよいですか?

ありがとうございました!

その他の関連情報:

user.rb

class User < ActiveRecord::Base 
    attr_accessor :password, :updating_password 
    attr_accessible :name, :email, :password, :password_confirmation, :photo, 
        :profile 
    before_save :downcase_fields 
    before_save :encrypt_password 
    validates_presence_of :password, :if => :should_validate_password? 
    validates_confirmation_of :password, :if => :should_validate_password?  
    def should_validate_password? 
     updating_password || new_record? 
    end 

    validates :name, :presence => true, 
       :name_format => true, 
       :uniqueness => { :case_sensitive => false }   
    validates :email, :presence => true, 
       :email_format => true, 
       :uniqueness => { :case_sensitive => false } 
    validates :password, 
       #:presence => true, 
       #:confirmation => true, 
       :length => { :within => 6..40 } 
    validates :profile, :length => { :maximum => 160 } 
end 
+0

Userクラスの外観はどうですか? –

+0

@juwiley自分の投稿に関連情報を含むユーザーモデルを追加しました。 – Huy

答えて

0

、あなたはプロファイル編集の話をしているを考えると、すなわちあなたがすでにパスワードを持つ登録ユーザーを持っている、あなたは条件付きでパスワードの更新をスキップする場合があります。

password_confirmationが空白の場合は、passwordpassword_confirmationを削除するだけです。私:

class UsersController < ApplicationController 
    before_filter :skip_password_attribute, only: :update 

    ... 

    def update 
    ... 
    end 

    private 

    def skip_password_attribute 
    if params[:password].blank? && params[:password_validation].blank? 
     params.except!(:password, :password_validation) 
    end 
    end 
end 
+4

隠しフォームフィールドを追加しても、「パスワードは空白にできません(パスワードは短すぎます(最小は6文字)です」というエラーが表示されます)。 – Huy

+0

同じ問題がhyngynにあることがあります。 – jwg2s

+0

"パスワードは空白にできません"と "パスワードが短すぎます(最小は6文字)"を削除するには、ユーザーモデル(user.rbファイル)に移動し、2つの ":on =>:create"パスワードの長さとパスワードの有無を確認するステートメント(例: "validates:password_confirmation、:presence => true、:on =>:create") – Alexandra

1

(1)@userは新しいレコードをする場合@userがない場合、通常、のform_forを作成するために行く、となります新しい記録は更新する予定です。これが失敗した場合は、:url、maybe the:メソッドを設定する必要があります。

<%= form_for @user, :url => (@user.new_record? ? users_path : user_path(@user), 
      :html => (@user.new_record? ? { :multipart => true, :method => :post } : { :multipart => true, :method => :put } do |f| %> 

(2)何を尋ねたことは

class User 
    validate :validate_password_length 

    def validate_password_length 
    !new_record? || password.length >= 8 
    end 
end 

あるしかし、それは、新しいユーザーが短いものに変更にパスワードをアカウントを作成することができます。だから、次の操作を行う方が良いでしょう:

class User 
    validate :validate_password_length 

    def validate_password_length 
    !password_changed? || password.length >= 8 
    end 
end 
0

私はユーザーの認証&のための工夫をお勧めします。これは工夫ソース(https://github.com/plataformatec/devise/blob/master/lib/devise/models/validatable.rb)から取られる:

validates_presence_of  :password, :if => :password_required? 
validates_confirmation_of :password, :if => :password_required? 
validates_length_of  :password, :within => 6..128, :allow_blank => true 

protected 
    def password_required? 
    !persisted? || !password.nil? || !password_confirmation.nil? 
    end 
+0

このメソッドを使うと、隠しフォームを追加しても、パスワード「空白にすることはできません。 パスワードは短すぎます(最小は6文字です)」が表示されます。フィールド。 – Huy

-1

は、あなただけのvalidate:on => :createを追加する必要があります。

+2

この変更を行う必要がある場所についていくつかの文脈を提供することをお勧めします。おそらく変更がどこに行かなければならないかを引用するコードスニペットですか? –

0

ここで私はこの問題を解決しましたが、それは理想的ではないと確信しています。パスワード強度のルールを追加すると、検証方法がより複雑になります。

実際にコントローラを変更する必要はありません。このシナリオを処理するためにモデルを修正することができます。

最初に、passwordフィールドとpassword_confirmationフィールドに:on => :create属性を設定できます。しかし、これにはユーザーが登録時に準拠パスワードを提供しなければならないという副作用がありますが、後で非準拠のパスワードに変更することができます。これを解決するために、更新時にパスワードフィールドを検証するためにbefore_updateコールバックを追加しました。私Userクラスは今、このようなものになります。上記のコメントで述べたように

class User < ActiveRecord::Base 
    ... 
    before_update :check_password 
    ... 
    validates :password, presence: true, 
         length: { minimum: 6 }, 
         on: :create 

    validates :password_confirmation, presence: true, 
            on: :create 
    ... 
    private 
    ... 
    def check_password 
     is_ok = self.password.nil? || self.password.empty? || self.password.length >= 6 

     self.errors[:password] << "Password is too short (minimum is 6 characters)" unless is_ok 

     is_ok # The callback returns a Boolean value indicating success; if it fails, the save is blocked 
    end 
end 

を、この方法の結果は保存が試行されるかどうかを決定します。ユーザーがエラーメッセージを出さずに編集フォームに戻ってくるのを防ぐため、私はそれを挿入します。 [:password]は、エラーをどのフィールドに添付するかを指示します。

関連する問題