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

On Tue, Feb 14, 2012 at 7:51 PM, Soichi I. [email protected]
wrote:

 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.

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

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

Javier Q

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

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” }

On Tue, Feb 14, 2012 at 8:14 PM, Soichi I. [email protected]
wrote:

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

On Tue, Feb 14, 2012 at 8:34 PM, Soichi I. [email protected]
wrote:

@script }

<%= 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