I created an rjs file to handle an ajax request to update my index view
for a particular view template I''m working with. I''m using..
In the index.js.rjs file:
page.replace_html("headstart" , :partial => "headstart" ,
:object =>
@teamnames)
page.replace_html("teamheaders" , :partial =>
"teamheaders" , :object =>
@teamnames)
page.replace_html("team0" , :partial => "team0" , :object
=> @teamnames)
page.replace_html("boxscore" , :partial => "boxscore" ,
:object =>
@teamnames)
In the index.html file the part that corresponds to this is:
<% form_remote_tag :url => { :action => :index, :id => @teamnames }
do
%>
<span class="top" id="top">
<%= collection_select(:team, :id, @teamnames, :id, :name,
options ={ :prompt => "- Select Team One" }, { :name =>
''teamone'' } )
%>
</span>
<span class="top" id="top">
<%= collection_select(:team, :id, @teamnames, :id, :name,
options ={ :prompt => "- Select Team Two" }, { :name =>
''teamtwo'' } )
%>
</span>
<span class="middle" id="middle">
<%= image_submit_tag(''/images/matchup.jpg'',
:title =>
"Matchup", :onmouseover =>
"this.src=''/images/matchup_o.jpg''",
:onmouseout => "this.src=''/images/matchup.jpg''")
%>
</span>
<% end %>
And finally in the controller, the issue I''m having is with regards to:
def index
@teamnames = Team.find(:all, :order => "name ASC")
validate_team_select(params[:teamone], params[:teamtwo])
end
def validate_team_select(teamone,teamtwo)
if teamone == teamtwo && teamone != ""
flash[:notice] = ''You cannot compare a team to itself!''
redirect_to virtual_matchups_path and return
elsif teamone == "" || teamtwo == ""
flash[:notice] = ''You must select two unique teams!''
redirect_to virtual_matchups_path and return
else
... My Code Routines (doesn''t apply to the problem here) ...
respond_to do |format|
format.html
# the format js applies to the RJS template
format.js
format.xml { render :xml => @virtuals }
end
end
In my application layout file I have:
<% if flash[:notice] -%><div id="notice"><%=
flash[:notice] %></div><%
end -%>
======================
So, here''s my issue. Before I placed the ajax request handling in, if
you selected no teams from the dropdown form, or had the same teams, or
had one team and no other teams, the validation above would work fine.
It''s just a custom validation (no db in virtuals so can''t do
validation
there) that checks to make sure everything is fine.
When the validation failed before, my flash notice which is in my layout
file would spring to action. Now, the ajax request just doesn''t show
anything. When I hit the validation errors, it just doesn''t do or
respond to anything (no errors are shown). If I go to another page on
my site, then the flash notification takes place.
Again, this worked fine before ajax so my guess here is that I need to
place some type of update for the flash notice in rjs but I''m not sure
how. In my example above, I was forcing a render back to virtuals path
but ajax takes over that forced render now.
Any advice on how to get this working?
Thanks.
--
Posted via http://www.ruby-forum.com/.
Alpha Blue
2009-Aug-02 16:36 UTC
Re: Ajax request render from RJS and handling Flash notices
I figured out how to get it done. My situation was a bit different than
the norm but the following works:
in my rjs:
page.replace_html("headstart" , :partial => "headstart" ,
:object =>
@teamnames) if @flashsetting == false
page.replace_html("teamheaders" , :partial =>
"teamheaders" , :object =>
@teamnames)
page.replace_html("team0" , :partial => "team0" , :object
=> @teamnames)
page.replace_html("boxscore" , :partial => "boxscore" ,
:object =>
@teamnames)
page.replace_html :notice, ""
flash.discard
in my controller:
def validate_team_select(teamone,teamtwo)
if teamone == teamtwo && teamone != ""
flash[:notice] = ''You cannot compare a team to itself!''
virtual_redirect
elsif teamone == "" || teamtwo == ""
flash[:notice] = ''You must select two unique teams!''
virtual_redirect
else
virtual_response(teamone, teamtwo)
end
end
def virtual_redirect
respond_to do |format|
format.html { redirect_to virtual_matchups_path }
format.js { render :update do |page| page.replace_html :notice,
flash[:notice] end }
end
end
Then I placed a notice div inside the actual view and not in the layout,
nesting a partial to the notice alert with css coloring..
This works well in that it performs all my ajax requests through a
standard process but if it reaches a validation error, it goes to the
virtual_redirect which displays the correct messages without altering
the view on the page.
When it does validate correctly, the message is cleared and flash
notices are discarded on subsequent page redirects.
--
Posted via http://www.ruby-forum.com/.