0

私はDeviseに基づいたモデルエージェンシーを持っています:

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 

次に、代理店の更新フォームは次のとおりです。
ここに画像の説明を入力

ユーザーが password および password_confirmation フィールドへの入力を省略できるようにしたいと考えています。ただし、ユーザーがパスワード フィールドに入力する場合は、password_confirmation フィールドを必須にする必要があります。

password_required で問題をほぼ解決しましたか? 方法。しかし、クライアントで JavaScript の検証が必要なため、問題を完全に解決することはできません。

ここに画像の説明を入力

password および password_confirmation フィールドの JS 検証をクライアントから削除するにはどうすればよいですか?

4

2 に答える 2

1

試す:

validates_confirmation_of :password, :if => :password_required?

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

検証はpassword_required?true を返す場合にのみトリガーされ、フィールドが nilpassword_required?の場合は false を返すことに注意してください。password_confirmation

したがって、password_confirmationフィールドを nil にするには、フォームからフィールドを削除するだけでよく、そうすればpassword_confirmation常に nil になり、検証を回避できます。

代替ソリューション:

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 レベルでは、上記の条件を使用して空白で表示するだけです。

于 2013-02-06T11:44:12.740 に答える
0

@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_scaffold構成へ(上記を参照)

于 2013-02-06T14:00:40.090 に答える