質問

私は策定に基づいてモデル機関を持っています:

class Agency < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  attr_accessible :name, :email, :phone, :address, :city, :state, :zip,
                  :notes, :is_admin, :password, :password_confirmation, :remember_me

  protected

  def password_required?
   !persisted? || password.present? || password_confirmation.present?
  end
end

また、Active_Scaffoldに基づいてAgenciesControllerを持っています。

class Admin::AgenciesController < Admin::BaseController
  before_filter :authorize_admin!

  active_scaffold :agency do |conf|
    actions.exclude :show

    create.link.page = true
    update.link.page = true

    list.columns = [
      :name, :email, :phone, :address, :city, 
      :state, :zip, :notes, :events, :is_admin
    ]

    create.columns = [
      :name, :email, :phone, :address, :city, :state, :zip, 
      :is_admin, :password, :password_confirmation
    ]

    update.columns = [
      :name, :email, :phone, :address, :city, :state, :zip, 
      :is_admin, :password, :password_confirmation
    ]

    columns.add :password
    columns.add :password_confirmation    

    columns[:password].form_ui = :password
    columns[:password_confirmation].form_ui = :password
  end
end 

それから、Agency Updateフォームは次のとおりです。
enter image description here

ユーザーがパスワードとpassword_confirmationフィールドの記入を省略する機会を提供したいと思います。ただし、ユーザーがパスワードフィールドに入力した場合、password_confirmationフィールドは必要です。

Password_Requiredによって私の問題をほとんど解決しましたか?方法。しかし、JavaScriptがクライアント上で必要な検証は私が私の問題を完全に解決することを許可しません。

enter image description here

パスワードとpassword_confirmationフィールドのためにクライアントからJSの変動を削除する方法

役に立ちましたか?

解決

試す:

validates_confirmation_of :password, :if => :password_required?

validates :password_confirmation, :presence => true, :if => '!password.nil?'

検証はIFにトリガーされるだけであることに注意してください password_required? trueを返します password_required? の場合はfalseを返します password_confirmation フィールドはnilです。

そうするために password_confirmation NILになるためのフィールド、あなたは単に削除する必要があります password_confirmation フォームからのフィールドとその方法では、常に検証を迂回することができます。

代替ソリューション:

1) パスワードフィールドの検証をスキップします

2)パスワードフィールドにランダムなセキュリティ生成された番号を保存するだけです(簡単なので、整合性も維持するためです)。

self.password = self.password_confirmation = SecureRandom.urlsafe_base64(n=6)

また、そのようなフィールドをユーザーによって残されているとおりに識別されるべきであれば、その後、そのような状態に固有のパスワードを与えることができます。

if(self.password == "something unique" and self.password_confirmation == "something unique")
    flash[:notice] = "The user has not password"
end

その後、UIレベルでは、上記の条件を使用して空白で表示するだけです。

他のヒント

@Saurabh Jain、あなたのアドバイスのためにたくさんありがとう。
しかし解決策はとても簡単でした。
Active_Scaffoldがパスワードフィールドの入力タグに必要な属性を追加することを見出しました。
別の単語によって、クライアントはHTMLを取得します

<input type="password" required="required" size="30" name="record[password_confirmation]" id="record_password_confirmation_4" class="password_confirmation-input text-input" autocomplete="off">

正確に必須の属性が私の問題になりました:) HTMLからそれを削除するには

columns[:password].required = false;

Admin :: AgenciesControllerのActive_Scafford設定に(上記の参照)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top