action when failed 'save'

Rails 3.1.3

I have a model, 'Script' like

class Script < ActiveRecord::Base   belongs_to :video   has_many :users

  validates :startp,   :presence => true,   :uniqueness => true, #HERE!!!!   :numericality => { :only_integer => true, :less_than => 1000}

  validates :script,   :presence => true end

As seen, 'script' has a field 'startp' which is unique. So when users try to save a 'script' having the 'startp' which is identical with that of another 'script', the 'save' action fails. Correct me if I am wrong.

Then, I would like to set up the action upon the failure as follows

  def create     @script = Script.new(params[:script])

    respond_to do |format|       if @script.save         format.json { render json: @script, status: :created, location: @script }       else         format.html { redirect_to @script } #HERE!!!! # format.json { render json: @script.errors, status: :unprocessable_entity }       end     end   end

hoping that it will redirect to 'script' page. But it doesnt.

Could anyone point out where I am mistaken?

Thanks in advance.

soichi

but after @script.save you’re redirecting nowhere… you have to specify something like

redirect_to :controller=> “scripts”, :action=>“index”

Javier Q

I haven’t read it carefully, but If I’m now wrong you just only have to render the new view again

format.html { render action: “new” }

Sorry forgot to mention.

When 'save' action succeeds, it throws json data and catches as Ajax. like

  <%= form_for script, :remote => true do |f| %>

So, when 'save' succeeds, it has no problem.

Does it have anything to do with the case of failure ?

soichi

Not really =) I thought you were having trouble with what to show after save :slight_smile:

If there’s an error you just have to render the ‘new’ action again.

format.html { render action: “new” }

Sorry, I misunderstood. When it succeeds, I don't want the page to change.

So, I changed it to

  def create     @script = Script.new(params[:script])     respond_to do |format|       if @script.save         format.json { render json: @script, status: :created, location: @script }       else         format.html { render action: "new" }         format.json { render json: @script.errors, status: :unprocessable_entity }       end     end   end

But it doesnt do anything. Of course, data has not been changed at all. Maybe

<%= form_for script, :remote => true do |f| %>

is affecting the failure case as well?

soichi

Ahh, with remote true …

In that case you just only have to show an errors div (or an alert), and inside show the @script.errors messages

create.js.erb (That I guess you have)

<% if @script.errors.any? %>

alert(“There’s an error!”);

<% else%>

“Do what you’ve been doing”

<%end%>

Thanks for your help. When I changed the code a bit, a different error is appeared. So I raise another thread. Thanks anyway.

soichi