Rails 3: создание проверки с помощью: if - PullRequest
10 голосов
/ 18 июня 2011

Привет! Я пытаюсь настроить проверку, которая вызывается только в определенном представлении формы, для этого я пытаюсь создать скрытое поле для виртуального атрибута в форме и установить для него значение, а затем выполнить проверку: если виртуальный атрибут равен значению.

Пока у меня есть:

## 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 %>

Ответы [ 3 ]

14 голосов
/ 18 июня 2011

Значение скрытого поля 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
5 голосов
/ 17 сентября 2013

написать однострочный код, это может помочь вам организовать ваш код в простом.

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

или

validates_presence_of :password_confirmation, :if => Proc.new {|u| confirmation_validation == '100'}
1 голос
/ 01 апреля 2013

Этот ответ очень поздний, но для будущих зрителей SO, я думаю, ответ на вопрос @Rajesh

Привет, выше показывает ошибку для меня, и ошибка приведена ниже.Не могу массово присваивать защищенные атрибуты.Почему?

Вам нужно удалить скрытое поле, которое вы используете в качестве флага, из хэша params, прежде чем оно будет присвоено записи.Что-то вроде

params.reject{|p| p == name_of_hidden_field} 
...