Question about periodically_call_remote


#1

I’m not sure how to ask this succinctly, so bear with me. I’m trying to
learn how to use periodically_call_remote to update a div.

I have a table whose rows have the data I want to display in the div,
one at a time, every 10 seconds (let’s say). For simplicity let’s
pretend each row just has one column, “description,” which is just a
text column.

I have a partial, let’s say it’s called _currentdescription.rhtml, that
just shows the description in a p tag.

The table row to show in the view is initially determined by the
controller’s index action, and subsequent calls go through
next_description:

def index
@description_index = 0
@description = get_current_description
end

Called by ajax call; renders the partial directly after

determining next row to show

def next_description
@allrows = find_all
@description_index = params[:oldindex] + 1

if we’ve shown all, then start over again

if (@description_index > @allrows.length)
@description_index = 0
end
@description = get_current_description
render :partial => ‘currentdescription’
end

def get_current_description
@allrows[@description_index].description
end

Ok, now the index.rhtml fragment looks like:

<%= render :partial => 'currentdescription' %> ,%= periodically_call_remote(:update => 'info', :url => { :action => 'next_description', :oldindex => @description_index })

Whew! Thanks for staying with me this far.

Now, the behavior I’m seeing is that the first row’s description is
shown, and then ten seconds later the second one appears (yay!). But it
never changes after that.

The problem is that the javascript generated by periodically_call_remote
is never updated so it’s always calling with :oldindex = 0.

How can I have the periodically_call_remote “know” about the new value
of @description_index that I’ve assigned from the “next_description”
call?

The only way around this that I can think of is to keep track of the
index server-side instead of client-side, but I really want to avoid
having to manage user sessions if possible.

Thanks!
Jeff