Hi,
I use ajax to edit or create entry in my DB : a div box opens on top of the page
(a bit like a pop up) with all the fileds to fill. Now to display properly an
error message in the div box I use the remote tag for the
''update'' or ''create'' action
edit.rhtml :
<%= form_remote_tag :update=>''ajax_div'',
:url=>{:controller=>''matters_crud'', :action
=>:update,:id => @matter } %>
<%= render_partial ''form'' %>
<%= submit_tag ''Edit'' %>
<%= end_form_tag %>
matter_crud_controller.rb :
def update
@matter = Matter.find(params[:id])
if @matter.update_attributes(params[:matter])
flash[:notice] = ''Matter was successfully updated.''
render :action=>''confirm''
else
render :action => ''edit''
end
end
The thing is, if their isn''t any error I would like the hole page to
refresh, like in a normal http request so my new or updated entry appears
properly.
One solution I thought of is this:
when update or save is successfull I render ''confirm'' which
has ''onLoad=window.location.reload( false )'' but that
doesn''t seem to work (it does though with onClick for example).
So my question is how could I make an xml_http_request behave as a normal http
request when condition x is met. I''ve seen in the pragmatic book this
is possible when browser has javascript disabled. Of course it''s not
the same here since the condition to be evaluated is on the server side.
Any ideas for a workaround ?
Thanks
_______________________________________________
Rails mailing list
Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org
http://lists.rubyonrails.org/mailman/listinfo/rails
When I''ve needed something like this, I will typically manage things
manually. Instead of specifying the :update element, I will handle
all of that in a :complete handler by hand. The :complete handler
checks the value of a custom header (''X-What-To-Do'', for
example). If
the header is ''error'', then I update the
''ajax_div'' element with the
request.responseText data. If the header is ''ok'', then I
execute
window.location.reload(false).
Does that make sense? If not, let me know and I can post a more
detailed example.
- Jamis
On Nov 18, 2005, at 4:15 AM, Charly wrote:
> Hi,
> I use ajax to edit or create entry in my DB : a div box opens on
> top of the page (a bit like a pop up) with all the fileds to fill.
> Now to display properly an error message in the div box I use the
> remote tag for the ''update'' or ''create''
action
> edit.rhtml :
> <%= form_remote_tag :update=>''ajax_div'',
> :url=>{:controller=>''matters_crud'', :action
=>:update,:id =>
> @matter } %>
> <%= render_partial ''form'' %>
> <%= submit_tag ''Edit'' %>
> <%= end_form_tag %>
>
> matter_crud_controller.rb :
> def update
> @matter = Matter.find(params[:id])
> if @matter.update_attributes(params[:matter])
> flash[:notice] = ''Matter was successfully updated.''
> render :action=>''confirm''
> else
> render :action => ''edit''
> end
> end
>
> The thing is, if their isn''t any error I would like the hole page
> to refresh, like in a normal http request so my new or updated
> entry appears properly.
> One solution I thought of is this:
> when update or save is successfull I render ''confirm''
which has
> ''onLoad=window.location.reload( false )'' but that
doesn''t seem to
> work (it does though with onClick for example).
>
> So my question is how could I make an xml_http_request behave as a
> normal http request when condition x is met. I''ve seen in the
> pragmatic book this is possible when browser has javascript
> disabled. Of course it''s not the same here since the condition to
> be evaluated is on the server side.
> Any ideas for a workaround ?
>
> Thanks
> _______________________________________________
> Rails mailing list
> Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org
> http://lists.rubyonrails.org/mailman/listinfo/rails
Hello Jamis I have the same plablem Charly have. Could you pls elaborate a little more on how to implement the :complete handler? Thank you! Okada. 2005/11/18, Jamis Buck <jamis-uHoyYlH2B+GakBO8gow8eQ@public.gmane.org>:> > When I''ve needed something like this, I will typically manage things > manually. Instead of specifying the :update element, I will handle > all of that in a :complete handler by hand. The :complete handler > checks the value of a custom header (''X-What-To-Do'', for example). If > the header is ''error'', then I update the ''ajax_div'' element with the > request.responseText data. If the header is ''ok'', then I execute > window.location.reload(false). > > Does that make sense? If not, let me know and I can post a more > detailed example. > > - Jamis > > On Nov 18, 2005, at 4:15 AM, Charly wrote: > > > Hi, > > I use ajax to edit or create entry in my DB : a div box opens on > > top of the page (a bit like a pop up) with all the fileds to fill. > > Now to display properly an error message in the div box I use the > > remote tag for the ''update'' or ''create'' action > > edit.rhtml : > > <%= form_remote_tag :update=>''ajax_div'', > > :url=>{:controller=>''matters_crud'', :action =>:update,:id => > > @matter } %> > > <%= render_partial ''form'' %> > > <%= submit_tag ''Edit'' %> > > <%= end_form_tag %> > > > > matter_crud_controller.rb : > > def update > > @matter = Matter.find(params[:id]) > > if @matter.update_attributes(params[:matter]) > > flash[:notice] = ''Matter was successfully updated.'' > > render :action=>''confirm'' > > else > > render :action => ''edit'' > > end > > end > > > > The thing is, if their isn''t any error I would like the hole page > > to refresh, like in a normal http request so my new or updated > > entry appears properly. > > One solution I thought of is this: > > when update or save is successfull I render ''confirm'' which has > > ''onLoad=window.location.reload( false )'' but that doesn''t seem to > > work (it does though with onClick for example). > > > > So my question is how could I make an xml_http_request behave as a > > normal http request when condition x is met. I''ve seen in the > > pragmatic book this is possible when browser has javascript > > disabled. Of course it''s not the same here since the condition to > > be evaluated is on the server side. > > Any ideas for a workaround ? > > > > Thanks > > _______________________________________________ > > Rails mailing list > > Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org > > http://lists.rubyonrails.org/mailman/listinfo/rails > > _______________________________________________ > Rails mailing list > Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org > http://lists.rubyonrails.org/mailman/listinfo/rails >_______________________________________________ Rails mailing list Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org http://lists.rubyonrails.org/mailman/listinfo/rails
On Nov 18, 2005, at 10:31 AM, Carlos Y. Okada wrote:> Hello Jamis > > I have the same plablem Charly have. Could you pls elaborate a > little more on how to implement the :complete handler? > > Thank you! > > Okada.Sure, here''s a snippet from the hypothetical RHTML file: <script type="text/javascript"> function handleComplete(request) { var instruction = request.getResponseHeader(''X-Instruction'') if(instruction == "error") { $(''ajax_div'').innerHTML = request.responseText } else { window.location.reload(false) } } </script> <div id="ajax_div"></div> <%= form_remote_tag :complete=>''handleComplete(request)'', :url=>{:controller=>''matters_crud'', :action =>:update, :id => @matter} %> <%= render_partial ''form'' %> <%= submit_tag ''Edit'' %> </form> Then, in your controller, you just do: def update @matter = Matter.find(params[:id]) if @matter.update_attributes(params[:matter]) headers[''X-Instruction''] = "ok" render :nothing => true else headers[''X-Instruction''] = "error" render :partial => ''error'' end end - Jamis> > > > 2005/11/18, Jamis Buck <jamis-uHoyYlH2B+GakBO8gow8eQ@public.gmane.org>: When I''ve needed > something like this, I will typically manage things > manually. Instead of specifying the :update element, I will handle > all of that in a :complete handler by hand. The :complete handler > checks the value of a custom header (''X-What-To-Do'', for example). If > the header is ''error'', then I update the ''ajax_div'' element with the > request.responseText data. If the header is ''ok'', then I execute > window.location.reload(false). > > Does that make sense? If not, let me know and I can post a more > detailed example. > > - Jamis > > On Nov 18, 2005, at 4:15 AM, Charly wrote: > > > Hi, > > I use ajax to edit or create entry in my DB : a div box opens on > > top of the page (a bit like a pop up) with all the fileds to fill. > > Now to display properly an error message in the div box I use the > > remote tag for the ''update'' or ''create'' action > > edit.rhtml : > > <%= form_remote_tag :update=>''ajax_div'', > > :url=>{:controller=>''matters_crud'', :action =>:update,:id => > > @matter } %> > > <%= render_partial ''form'' %> > > <%= submit_tag ''Edit'' %> > > <%= end_form_tag %> > > > > matter_crud_controller.rb : > > def update > > @matter = Matter.find(params[:id]) > > if @matter.update_attributes(params[:matter]) > > flash[:notice] = ''Matter was successfully updated.'' > > render :action=>''confirm'' > > else > > render :action => ''edit'' > > end > > end > > > > The thing is, if their isn''t any error I would like the hole page > > to refresh, like in a normal http request so my new or updated > > entry appears properly. > > One solution I thought of is this: > > when update or save is successfull I render ''confirm'' which has > > ''onLoad=window.location.reload( false )'' but that doesn''t seem to > > work (it does though with onClick for example). > > > > So my question is how could I make an xml_http_request behave as a > > normal http request when condition x is met. I''ve seen in the > > pragmatic book this is possible when browser has javascript > > disabled. Of course it''s not the same here since the condition to > > be evaluated is on the server side. > > Any ideas for a workaround ? > > > > Thanks > > _______________________________________________ > > Rails mailing list > > Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org > > http://lists.rubyonrails.org/mailman/listinfo/rails > > _______________________________________________ > Rails mailing list > Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org > http://lists.rubyonrails.org/mailman/listinfo/rails > > _______________________________________________ > Rails mailing list > Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org > http://lists.rubyonrails.org/mailman/listinfo/rails
Thanks a lot for your answer Jamis, I had sent a reply earlier asking for more insight but I dont understand how gmane handles responses. Maybe it will appear soon... -- Posted via http://www.ruby-forum.com/.
I''m using form_remote_tag from a page that lists a few records to allow users to create/update one of the records in place (very much like the Todo list in Basecamp). My problem is: Whe validation fails, I want to update the <div> showing the error_message_for and the form again, but when update succeed, I want to refresh the whole page. I''m trying to use the solution Jamis sugests bellow, and it works. The only problem is that if an error occurs in controller during create/update actions, nothing happens at the browser. I can see the error in the log, but how can I give feedback to the user? Tks Okada. 2005/11/18, Jamis Buck <jamis-uHoyYlH2B+GakBO8gow8eQ@public.gmane.org>:> > On Nov 18, 2005, at 10:31 AM, Carlos Y. Okada wrote: > > > Hello Jamis > > > > I have the same plablem Charly have. Could you pls elaborate a > > little more on how to implement the :complete handler? > > > > Thank you! > > > > Okada. > > Sure, here''s a snippet from the hypothetical RHTML file: > > <script type="text/javascript"> > function handleComplete(request) { > var instruction = request.getResponseHeader(''X-Instruction'') > if(instruction == "error") { > $(''ajax_div'').innerHTML = request.responseText > } else { > window.location.reload(false) > } > } > </script> > > <div id="ajax_div"></div> > <%= form_remote_tag :complete=>''handleComplete(request)'', > :url=>{:controller=>''matters_crud'', > :action =>:update, > :id => @matter} %> > <%= render_partial ''form'' %> > <%= submit_tag ''Edit'' %> > </form> > > Then, in your controller, you just do: > > def update > @matter = Matter.find(params[:id]) > if @matter.update_attributes(params[:matter]) > headers[''X-Instruction''] = "ok" > render :nothing => true > else > headers[''X-Instruction''] = "error" > render :partial => ''error'' > end > end > > - Jamis > > > > > > > > > 2005/11/18, Jamis Buck <jamis-uHoyYlH2B+GakBO8gow8eQ@public.gmane.org>: When I''ve needed > > something like this, I will typically manage things > > manually. Instead of specifying the :update element, I will handle > > all of that in a :complete handler by hand. The :complete handler > > checks the value of a custom header (''X-What-To-Do'', for example). If > > the header is ''error'', then I update the ''ajax_div'' element with the > > request.responseText data. If the header is ''ok'', then I execute > > window.location.reload(false). > > > > Does that make sense? If not, let me know and I can post a more > > detailed example. > > > > - Jamis > > > > On Nov 18, 2005, at 4:15 AM, Charly wrote: > > > > > Hi, > > > I use ajax to edit or create entry in my DB : a div box opens on > > > top of the page (a bit like a pop up) with all the fileds to fill. > > > Now to display properly an error message in the div box I use the > > > remote tag for the ''update'' or ''create'' action > > > edit.rhtml : > > > <%= form_remote_tag :update=>''ajax_div'', > > > :url=>{:controller=>''matters_crud'', :action =>:update,:id => > > > @matter } %> > > > <%= render_partial ''form'' %> > > > <%= submit_tag ''Edit'' %> > > > <%= end_form_tag %> > > > > > > matter_crud_controller.rb : > > > def update > > > @matter = Matter.find(params[:id]) > > > if @matter.update_attributes(params[:matter]) > > > flash[:notice] = ''Matter was successfully updated.'' > > > render :action=>''confirm'' > > > else > > > render :action => ''edit'' > > > end > > > end > > > > > > The thing is, if their isn''t any error I would like the hole page > > > to refresh, like in a normal http request so my new or updated > > > entry appears properly. > > > One solution I thought of is this: > > > when update or save is successfull I render ''confirm'' which has > > > ''onLoad=window.location.reload( false )'' but that doesn''t seem to > > > work (it does though with onClick for example). > > > > > > So my question is how could I make an xml_http_request behave as a > > > normal http request when condition x is met. I''ve seen in the > > > pragmatic book this is possible when browser has javascript > > > disabled. Of course it''s not the same here since the condition to > > > be evaluated is on the server side. > > > Any ideas for a workaround ? > > > > > > Thanks > > > _______________________________________________ > > > Rails mailing list > > > Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org > > > http://lists.rubyonrails.org/mailman/listinfo/rails > > > > _______________________________________________ > > Rails mailing list > > Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org > > http://lists.rubyonrails.org/mailman/listinfo/rails > > > > _______________________________________________ > > Rails mailing list > > Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org > > http://lists.rubyonrails.org/mailman/listinfo/rails > > _______________________________________________ > Rails mailing list > Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org > http://lists.rubyonrails.org/mailman/listinfo/rails >_______________________________________________ Rails mailing list Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org http://lists.rubyonrails.org/mailman/listinfo/rails