11155
(-- --)
February 15, 2012, 12:51am
1
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” }
11155
(-- --)
February 15, 2012, 1:14am
4
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
If there’s an error you just have to render the ‘new’ action again.
format.html { render action: “new” }
11155
(-- --)
February 15, 2012, 1:34am
6
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%>
11155
(-- --)
February 16, 2012, 12:26am
8
Thanks for your help.
When I changed the code a bit, a different error is appeared. So I
raise another thread.
Thanks anyway.
soichi