4

ユーザーが自分のプロファイル(文字列)を編集できるように、 User モデルの 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
4

5 に答える 5

1

(1) 通常、@user が新しいレコードの場合、form_for は create に移動し、@user が新しいレコードでない場合は update に移動します。これが起こらない場合は、:url、または :method を設定する必要があります。

<%= 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
于 2012-05-11T19:37:25.003 に答える
1

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

削除するだけpasswordで、空白のpassword_confirmation場合。password_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
于 2012-05-11T20:00:35.750 に答える
0

理想的ではないことは確かですが、この問題を最終的に解決した方法は次のとおりです。追加のパスワード強度ルールがある場合、検証方法はより複雑になる必要があります。

基本的に、コントローラーを実際に変更する必要はまったくありません。モデルを修正して、このシナリオを処理できます。

まず、:on => :createpassword および password_confirmation フィールドに属性を設定できます。ただし、これには、ユーザーが登録時に準拠したパスワードを提供する必要がありますが、後で非準拠のパスワードに変更できるという副作用があります。これを解決するために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]エラーを添付するフィールドを指定します。

于 2013-05-31T19:46:09.897 に答える
0

ユーザー認証などにはdeviseをお勧めします。これはデバイスのソース (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
于 2012-05-11T20:07:39.660 に答える
-1

:on => :createに追加するだけですvalidate

于 2012-10-26T23:58:07.960 に答える