10

こんにちは私は特定のフォームビューでのみ呼び出される検証を設定しようとしています。これを行うには、フォームの仮想属性のhidden_​​fieldを作成し、これを値に設定してから、検証します:if the virtual属性は値と同じです。

これまでのところ:

## user model 

validates_presence_of :password_confirmation, :if => :confirmation_validation 

attr_accessible :email, :password, :password_confirmation, 
 :remember_me, :name, :avatar, :username, :bio, :confirmation_validation

def confirmation_validation
 # not sure what goes here???
end


## form view


<%= form_for(resource, :validate => true, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }, :html => {:multipart => true}) do |f| %>
<%= devise_error_messages! %>

<p><%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br />
<%= f.password_field :password %></p>

<p><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation %>
<% f.hidden_field :confirmation_validation, :value => 100%></p>

<p><%= f.submit "Update" %></p>
<% end %>
4

3 に答える 3

14

confirmation_validation非表示フィールドの値をparamsハッシュに含め、それに応じて仮想属性を設定する必要があります。したがって、値が設定されているかどうかを簡単に確認できます。

validates_presence_of :password_confirmation, :if => :should_confirm?

def should_confirm?
  confirmation_validation == '100' # Value of the hidden field as set in the form
end
于 2011-06-18T02:57:42.397 に答える
5

1行のコードを書くと、コードを簡単に整理するのに役立ちます。

validates_presence_of :password_confirmation, :if => lambda {|u| confirmation_validation == '100'}

また

validates_presence_of :password_confirmation, :if => Proc.new {|u| confirmation_validation == '100'}
于 2013-09-17T05:30:08.253 に答える
1

この回答は非常に遅いですが、将来のSO視聴者にとって、@Rajeshの質問に対する答えだと思います

ねえ、上記は私にとってエラーを示しており、エラーは以下に示されています。保護された属性を一括割り当てできません。なんで?

レコードに割り当てる前に、フラグとして使用している非表示フィールドをparamsハッシュから削除する必要があるということです。何かのようなもの

params.reject{|p| p == name_of_hidden_field} 
于 2013-04-01T16:38:05.470 に答える