Best practice for showing errors AND updating list


#1

Morning/Afternoon/Evening All,

This is my first post to the ruby message board so if my request is
better suited to another location just let me know,

The problem I keep coming up against is with a listing of objects and
updating that list via AJAX (for arguments we are talking about a list
of users).

As it stands I can currently submit a form, and update the list
(using :update => ‘list_div_name’ and generating the whole list again or
generating a partial of a single row and using Insertion.Top) and I can
also display the errors for a form using the same method and updating a
notification div above my form,

However, my problem occurs when I want to update a list on success
and display errors on failure,

I have figured the best way up until now would be to always update
the forms notification and either display the errors or generate a
hidden div and copy its contents to the top of the list if successful
but this seems far from efficient,

What I am essentially asking is there a standard / more efficient way
of doing this that I have missed completely or is my current method
suitable?

  • Michael

#2

Michael B. wrote:

However, my problem occurs when I want to update a list on success
and display errors on failure,

Look at the :success and :failure parameters of link_to_remote,
which can also be inside the :update parameter. Also available in
submit_to_remote, form_remote_tag, periodically_call_remote,
remote_function, observe_field, and observe_form:

http://api.rubyonrails.com/classes/ActionView/Helpers/JavaScriptHelper.html#M000433

Set the reponse status in your controller using the :status parameter
to render:

http://api.rubyonrails.com/classes/ActionController/Base.html#M000178


We develop, watch us RoR, in numbers too big to ignore.


#3

Using RJS (requires rails trunk) is probably the simplest way, you can
then control which parts of the page are updated. Your action may
become…

def add_user
@user = User.create(params[:user])
end

And add_user.rjs:

if @user.valid?
page.insert_html :top, ‘user_list’, :partial => ‘user’, :object =>
@user
else
page.replace_html ‘errors’, :partial => ‘errors’, :object =>
@user.errors
end

Make sure you remove the :update => bit from your helper call as well.
You can actually now put the RJS in the controller if you like…

def add_user

render :update do |page|
if @user
page.replace_html
end
end

Whatever takes your fancy :slight_smile:

Cheers, -Jonny.


#4

Thanks guys :slight_smile: that told me exactly what I was after


#5

Quick note, there is actually a plugin to allow you to use RJS outside
of the Trunk release. Can’t remember the site, but do a quick google
for it and you’ll run across it. Works great for me.