Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails not generating validation fail messages

I have a number of standard rails validations within my model:

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

If I don't fill out one of these fields within my form then I am taken back to the form as expected but the odd thing is no error messages are displayed. I am using the code below to display the error messages:

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

I also attempted to print out the @camera.errors object and this is what is shown:

#<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={}>
#

As you can see the messages hash is empty. I tried setting the validation error message manually by doing the following:

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

but it did not populate the messages hash either.

Controller update action is shown below:

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 

I am using Ruby version ruby 1.9.2p290 and Rails version 3.1.0.

Any assistance would be great!

Thanks

like image 799
stephenheron Avatar asked Sep 06 '11 16:09

stephenheron


1 Answers

Just a heads up that you'll get a Validation failed (ActiveRecord::RecordInvalid) error with an empty error message (if there are no other errors) when you have before_validation declarations and any of them returns false.

Note that before_validation callbacks must not return false (nil is okay) and this can happen by accident, e.g., if you are assigning false to a boolean attribute in the last line inside that callback method. Explicitly write return true in your callback methods to make this work (or just true at the end if your callback is a block (as noted here)).

UPDATE: This will no longer be an issue starting Rails 5.0, as return false will no longer halt the callback chain (throw :abort will now halt the callback chain).

UPDATE: You might also receive ActiveRecord::RecordNotSaved: Failed to save the record if a callback returns false.

like image 58
Vikrant Chaudhary Avatar answered Sep 20 '22 05:09

Vikrant Chaudhary