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