Xmlhttprequest for updating

Hello,

I am updating an object with an AJAX form:

view:

<% remote_form_for(@sample, :update => “content2”) do %>

parameter:
<%= select("sample","parameter",Parameter.find(:all).collect {|p| [p.description.gsub('_', ' '),p.id]},{},{:size => 4, :multiple => true}) %>

<%= submit_tag "add" %>

<% end %>

once form is sent, object is saved in def update in my controller:

controller:

def update
@sample = Sample.find(params[:id])

  if @sample.update_attributes(params[:sample])
    flash[:notice] = 'Sample was successfully updated.'
    redirect_to(@sample)
  else
    render :action => "edit"

  end

end

my problem is that redirect_to(@sample) call the show method via a
HTML request, so all my page is refreshed when the view show.html.erb
is displayed…which is not what i want as i sent the form through
AJAX in order to update the DOM “content2”

Is it possible to change redirect_to so that the call of def show is
done through xmlhttprequest and only my partial _show.html.erb is
displayed (I already have a show.js.rjs)?
I tryied to play with format in update but i always get an argument
error when request is done via AJAX.

def update:

respond_to do |format|
if @sample.update_attributes(params[:sample])
flash[:notice] = ‘Sample was successfully updated.’
format.html {redirect_to(@sample)}
format.xml_http_request :get, “show”,:id => @sample
else
render :action => “edit”

  end

May be i am not using correctly the xml_http_request function.

thank you for your help.

    format.xml_http_request :get, "show",:id => @sample

May be i am not using correctly the xml_http_request function.
You are correct. I don’t know what xml_http_request is actually supposed
to do, but this should read something more like:

respond_to do |format|
format.html { redirect_to(person_list_url) }
format.js
format.xml { render :xml => @person.to_xml(:include => @company)
}
end

format.xml_http_request { … } would be looking for a template
something like: show.xml_http_request.erb

Of course in reality, it just breaks.

respond_to do |format|
if @sample.update_attributes(params[:sample])
flash[:notice] = ‘Sample was successfully updated.’
format.html {redirect_to(@sample)}
format.xml_http_request :get, “show”,:id => @sample
else
render :action => “edit”

  end

This also feels wrong to me. Maybe something more like:

if @sample.update_attributes(params[:sample])
flash[:notice] = ‘Sample was successfully updated.’
respond_to do |format|
format.html {redirect_to(@sample)}
format.js
end
else
render :action => “edit”
end

if @sample.update_attributes(params[:sample])
flash[:notice] = ‘Sample was successfully updated.’
respond_to do |format|
format.html {redirect_to(@sample)}
format.js
end
else
render :action => “edit”
end
Oops, I take this back. It should be more like:

PUT /people/1

PUT /people/1.xml

def update
@person = Person.find(params[:id])

respond_to do |format|
  if @person.update_attributes(params[:person])
    flash[:notice] = 'Person was successfully updated.'
    format.html { redirect_to(@person) }
    format.js
    format.xml  { head :ok }
  else
    format.html { render :action => "edit" }
    format.xml  { render :xml => @person.errors, :status => 

:unprocessable_entity }
end
end
end

I don’t know where my head was on that previous post. Sorry about
that…

Hi Robert,

I indeed did try with format.js. It occurs an error: template is
missing, Missing template samples/update.js.erb.

as I say i already have a show template and show.js.rjs that is doing
everything necessary if def show is called by an AJAX request. that
why i would like to call def show via an xmlhttprequest but from def
update in the controller ( i am not sure i am really clear) and i
think that is what xml_http_request is supposed to do (but i can be
wrong as i am new to AJAX and co).

On Sep 10, 8:40 am, Robert W. [email protected]

On 10 Sep 2008, at 15:55, da991319 wrote:

think that is what xml_http_request is supposed to do (but i can be
wrong as i am new to AJAX and co).

format doesn’t actually help you here: the ajax request is genuinely
requesting html. What you can do is

if xhr?

end
(xhr? is an alias for xml_http_request?)

which can tell if the request was submitted by prototype.

Fred

Hi Frederick,

format doesn’t actually help you here: the ajax request is genuinely
requesting html. What you can do is

if xhr?

end

what i should write if xhr? is true?

something like:
render :partial =>show, :id => @sample

if i write that the def show is not call, neither show.js.rjs.
thanks

On Sep 10, 8:59 am, Frederick C. [email protected]