Есть ли способ для validates_presence_of только один раз? (чтобы пропустить проверку после уведомления пользователя) - PullRequest
1 голос
/ 03 апреля 2010

Итак, я бы хотел, чтобы пользователь увидел сообщение об ошибке, если он отправит комментарий и имя: пустое (типичное сообщение об ошибке, помощь в этом не требуется). Тем не менее, я бы хотел разрешить пользователю пропустить эту проверку, как только он получит уведомление о том, что «мы хотим, чтобы у всех комментариев было имя». Таким образом, он отправляет комментарий один раз, видит уведомление, затем может отправить форму снова без изменений, если он действительно не хочет добавлять имя, и validates_presences_of: name пропускается.

Но я не уверен, как это сделать. Я думал о том, чтобы проверить, откуда поступает запрос, но после создания ошибки передаются «новому» действию, которое совпадает с фактическим «новым» комментарием.

Затем я подумал о проверке наличия flash [ошибок], но это не сработает, потому что есть другие проверки, которые должен пройти комментарий.

Наконец, я подумал о попытке

validates_presences_of: name,: если =>: уведомлено

но не знал, как определить уведомление. Честно говоря, я ненавижу задавать такой открытый вопрос, но не знал, с чего начать. Итак, есть ли способ просто проверить определенную проверку один раз?

Редактировать: вот мой контроллер

@comments = params[:comments].values.collect{ |comment| current_user.comments.create(comment) }.reject { |p| p.errors.empty? }

и мой взгляд:

<% @comments.each_with_index do |comment, index| %>
   <% fields_for "comments[#{index}]", comment do |f| %>
      <%= render :partial => 'form', :locals => { :f => f } %>
   <% end %>
<% end %>

(материал в части 'form' - это просто базовый материал f.label, f.text_area)

Я думаю, что проблема действительно в моем представлении, поскольку она обрабатывает множество комментариев. Следует ли указывать скрытое поле для уведомлений в частичном «форме» или в «новом» представлении? Я думаю, что каждая итерация части не нуждается в скрытом поле с уведомлением, а только в самой форме. Но опять же я не знаю.

1 Ответ

3 голосов
/ 03 апреля 2010

Ваше решение должно работать нормально. Просто добавьте attr_accessor :notified к модели и добавьте для нее скрытое поле в виде: form.hidden_field :notified. Затем в действии контроллера, если проверки не пройдены, установите @comment.notified = true перед повторным отображением представления.

Редактировать: Да, с несколькими комментариями, вероятно, проще сделать

@notified = true

в операторе контроллера else, а затем добавьте

<%= f.hidden_field :notified, :value => @notified %>

к частичной форме. Затем для каждого комментария будет установлено значение notified, равное true, и проверка будет пропущена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...