validation not called on create, only update

I have a model, Work, that when I create a new instance with incorrect
field data does not call the validation methods. When I update an
existing instance with the same incorrect fields the validation
methods are called.

The create action fails on the save method and re-routes to the new
action, causing runtime errors.

I dont understand why update validates correctly and create doesn't.

Validation lines in the model are as follows:

validates :start, :presence => { :message => "must be a valid date/
time" }
validates :end, :presence => {:message => "must be a valid date/
time"}
validate :start_must_be_before_end_time

def start_must_be_before_end_time
    errors.add(:start, "must be before end time") unless
        self.start < self.end
end

Any pointers would be great.

I have a model, Work, that when I create a new instance with incorrect
field data does not call the validation methods. When I update an
existing instance with the same incorrect fields the validation
methods are called.

The create action fails on the save method and re-routes to the new
action, causing runtime errors.

The validation /should/ cause the save method to fail, that is the
whole point of validation. Or do you mean that the runtime errors
appear /during/ the save? If so then give us some more information
about that (the full error message and stack trace).

Colin

THanks for your response. The validation methods are not called on a
create, allowing the save method to be called, unprotected. I dont
want the save to be called let alone fail.

The validation method should stop the save method from being run and
redirect the user to the new action/view with errors displayed, right?

The validation methods in the model are called on an update and errors
reported back to the view. And I dont know why I am getting expected
validating behaviour with an update but not with a create.

I can post the error logs in the morning, but, on a create, they
report a rollback, a 500 error, because the failed save call triggers
the unexpected view to be routed.

Please don't top post, it makes it difficult to follow the thread.
Insert your reply into previous message at appropriate points. Thanks

THanks for your response. The validation methods are not called on a
create, allowing the save method to be called, unprotected. I dont
want the save to be called let alone fail.

As I said previously, the validation methods will be called during the
save, unless you are doing something to call them earlier. I suggest
you post the contents of the create action in the controller so we can
see what is going on.

The validation method should stop the save method from being run and
redirect the user to the new action/view with errors displayed, right?

The validation methods will not stop save from being called unless you
have included code in the create method to do this. Also any
redirection is up to the code you have written.

The validation methods in the model are called on an update and errors
reported back to the view. And I dont know why I am getting expected
validating behaviour with an update but not with a create.

I can post the error logs in the morning, but, on a create, they
report a rollback, a 500 error, because the failed save call triggers
the unexpected view to be routed.

Also post the relevant code.

Colin

Is there any chance you could post your controller code. I wonder
whether you've got a ".save false" in the create action...

I have a model, Work, that when I create a new instance with
incorrect
field data does not call the validation methods. When I update an
existing instance with the same incorrect fields the validation
methods are called.
The create action fails on the save method and re-routes to the new
action, causing runtime errors.
I dont understand why update validates correctly and create doesn't.
Validation lines in the model are as follows:
validates :start, :presence => { :message => "must be a valid date/
time" }
validates :end, :presence => {:message => "must be a valid date/
time"}
validate :start_must_be_before_end_time
def start_must_be_before_end_time
errors.add(:start, "must be before end time") unless
self.start < self.end
end
Any pointers would be great.

I think your (validation :start, :presence )
seems to be missing the "true" option.

validation :start, :presence => true, :message => "must be a
valid......

I have a model, Work, that when I create a new instance with
incorrect

Why not post your controller code as several people have asked rather
than reposting your original question.

Fred

Michael Pavling wrote in post #1062778:

THanks for your response. The validation methods are not called on a
create, allowing the save method to be called, unprotected. I dont
want the save to be called let alone fail.

Is there any chance you could post your controller code. I wonder
whether you've got a ".save false" in the create action...

Here is the create code in the controller:

  # POST /works
  # POST /works.json
  def create
    @work = Work.new(params[:work])
  @operations = @work.work_ticket.part.operations
    respond_to do |format|
      if @work.save
        format.html { redirect_to @work, notice: 'Work was successfully
created.' }
        format.json { render json: @work, status: :created, location:
@work }
      else
        format.html { render action: "new" }
        format.json { render json: @work.errors, status:
:unprocessable_entity }
      end
    end
  end

Martyn W. wrote in post #1063043:

Michael Pavling wrote in post #1062778:

THanks for your response. The validation methods are not called on a
create, allowing the save method to be called, unprotected. I dont
want the save to be called let alone fail.

Is there any chance you could post your controller code. I wonder
whether you've got a ".save false" in the create action...

Here is the create code in the controller:

  # POST /works
  # POST /works.json
  def create
    @work = Work.new(params[:work])
  @operations = @work.work_ticket.part.operations
    respond_to do |format|
      if @work.save
        format.html { redirect_to @work, notice: 'Work was successfully
created.' }
        format.json { render json: @work, status: :created, location:
@work }
      else
        format.html { render action: "new" }
        format.json { render json: @work.errors, status:
:unprocessable_entity }
      end
    end
  end

It looks like the validation is called, it is the render after the
failed fail that errors out now. I get the following error in the
browser:

Routing Error

No route matches {:controller=>"works"}

Try running rake routes for more information on available routes.

All the routes for Work are working, except in this case after a failed
invalid save.