Validations should work, but aren't?

Chris To wrote:

Hi,

I've added a couple of validations to my model, however whenever I submit with no information (to purposely fail) in the view form, I just get a generic rails error message (the kind with all the stack trace information).

I have a feeling it might be in my controller, though I can't seem to find out what to put to get it to pass to the model. Here's the code in my controller:

  def begin   end

  def end     @location = Location.new(params[:location])   end

Here's the code in my begin view:

<% form_for :location, @location, :url => {:action => "end"} do |f| %>

<%= f.label :city1 "enter 1st location" %> <p> <%= f.text_field :city1 %> <p> <%= f.label :city2, "enter 2nd location" %> <p> <%= f.text_field :city2 %>

<% end %>

And here's the code to my end view:

<%= @location.distance %>

Model code:

  validates_presence_of :city1, :city2

Any help would be appreciated. If there's anything I missed, please let me know.

Well, your 'wiring' is a little... unique.

From the api docs (http://api.rubyonrails.org/), for ActiveRecord::Base we have:

save(perform_validation = true)

Saves the model.

If the model is new a record gets created in the database, otherwise the existing record gets updated.

If perform_validation is true validations run. If any of them fail the action is cancelled and save returns false. If the flag is false validations are bypassed altogether. See ActiveRecord::Validations for more information.

There‘s a series of callbacks associated with save. If any of the before_* callbacks return false the action is cancelled and save returns false. See ActiveRecord::Callbacks for further details.

Sooo... without attempting a save, the validations aren't called by default. Otherwise how would you ever build a model without the potential for generating errors via validations due to fields that have not yet been set? In your case, you could call the validations manually with an @location.valid? if you don't want to attempt the save, but why not let Rails do it automagically?