Rails не генерирует сообщения об ошибках валидации - PullRequest
6 голосов
/ 06 сентября 2011

У меня есть несколько стандартных проверок рельсов в моей модели:

validates_presence_of :url_string
validates_uniqueness_of :url_string
validates_presence_of :stream_source
validates_presence_of :width
validates_presence_of :height
validates_presence_of :name
validates_uniqueness_of :name
validates_presence_of :customer_name
validates_presence_of :iframe_background_color

Если я не заполняю одно из этих полей в своей форме, то я возвращаюсь к форме, как ожидалось, но странно, что сообщения об ошибках не отображаются. Я использую приведенный ниже код для отображения сообщений об ошибках:

<% @camera.errors.full_messages.each do |error| %>
  <p><%= error %></p>
<% end %

Я также попытался распечатать объект @ camera.errors, и вот что показано:

#<ActiveModel::Errors:0x12db19bc @base=#<Camera id: 1, stream_source: "test", width: 640, height: 360, active: true, name: "test", url_string: "CAYD19Vp", customer_name: "test", iframe_background_color: "#FFFFFF", online: true, created_at: "2011-08-30 15:54:16", updated_at: "2011-09-06 15:52:48", audio: true, iframe_text_color: "#FF00FF", iframe_link_color: "#FF0000", notes: "Some notes!", offline_image_file_name: "Cake.jpg", offline_image_content_type: "image/jpeg", offline_image_file_size: 196591, offline_image_updated_at: "2011-09-06 12:12:38", pull_stream_url: "test", bitrate: "300-500", show_branding: false>, @messages={}>
#

Как видите, хэш сообщений пуст. Я попытался установить сообщение об ошибке проверки вручную, выполнив следующие действия:

validates_presence_of :name, :message => "No name present" 

но хэш сообщений тоже не заполнялся.

Действие обновления контроллера показано ниже:

def update
  @camera = Camera.find(params[:id])
  if @camera.update_attributes(params[:camera])
    flash[:notice] = "Camera updated"
    redirect_to nwcadmin_camera_path
  else
    redirect_to :action => :edit
  end 
end 

Я использую Ruby версии ruby ​​1.9.2p290 и Rails версии 3.1.0.

Любая помощь будет отличной!

Спасибо

Ответы [ 5 ]

6 голосов
/ 11 апреля 2014

Просто предупреждаю, что вы получите ошибку Validation failed (ActiveRecord::RecordInvalid) с пустым сообщением об ошибке (если других ошибок нет), когда у вас есть before_validation объявления, и любое из них возвращает false.

Обратите внимание, что before_validation обратные вызовы не должны возвращать false (nil нормально), и это может произойти случайно, например, если вы присваиваете false логический атрибут в последней строке внутри этого метода обратного вызова , Явно напишите return true в ваших методах обратного вызова, чтобы заставить это работать (или просто истина в конце, если ваш обратный вызов является блоком (как отмечено здесь )).

ОБНОВЛЕНИЕ : Это больше не будет проблемой, начиная с Rails 5.0, так как return false больше не будет останавливать цепочку обратных вызовов (throw :abort теперь будет останавливать цепочку обратных вызовов).

ОБНОВЛЕНИЕ : Вы также можете получить ActiveRecord::RecordNotSaved: Failed to save the record, если обратный вызов вернет false.

5 голосов
/ 07 сентября 2011

Мне удалось докопаться до моей проблемы. В контроллере я использовал:

redirect_to :action => :edit

Я должен был использовать:

render :action => :edit

Используя redirect_to, я выполнял действие редактирования в контроллере, который затем получал новый объект камеры из базы данных, а не сохранял текущий объект камеры из действия обновления.

2 голосов
/ 06 сентября 2011

Вы можете использовать flash [: message] или flash [: note] в коде контроллера для хранения сообщения об ошибке, которое можно использовать для отображения ошибок. Ссылка Просмотрите ссылку, ясно объяснено, как добавлять сообщения об ошибках и использовать их для отображения. Переменная экземпляра не содержит ошибок, поскольку при обновлении не выполняется проверка.ошибки, а затем

  <% @camera_errors.errors.full_messages.each do |error| %>
   <p><%= error %></p>
  <% end %>
2 голосов
/ 06 сентября 2011

Если вы не позвоните @camera.save или @camera.valid?, хэш ошибок не будет заполнен ошибками проверки. Пожалуйста, проверьте код вашего контроллера.

1 голос
/ 06 сентября 2011

Я не уверен, что это может вас заинтересовать или нет, но вы можете использовать этот официальный гем Rails: dynamic_form

Этот камень предоставляет вам два вспомогательных метода: error_messagesи error_messages_for

Подробнее см. в следующем руководстве по Rails: http://guides.rubyonrails.org/active_record_validations_callbacks.html#displaying-validation-errors-in-the-view

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