[NEWBIE] Error redirection

Dear all,

I am learning Rails and to do so I am writing a blogging system.
So far everything is going well but now I have a problem and I don't
know how to solve it.

Basically the "article" page presents the current post, all the
comments associated with it and a form for adding a new comment.
So, before yielding to the template rendering I populate the instance
variable with actual values:

def show_by_id
  @post = Post.find(params[:id]) #The actual article
  @comments = Comment.find(:all, :order => 'created_at
ASC', :conditions => ['post_id = ?', @post]) #All the comments
  @comment = Comment.new #Used for building the form for posting a new
comment.
  ...

(Note: this action is associated to the GET '/blog/post/:id' route)

So far so good.

Now I have to handle the comment posting. The controller's method for
doing this is pretty standard:

def create_comment
  @comment = Comment.new(params[:comment])
  respond_to do |format|
    ...Captcha validation...
    if @comment.save ...
  ...

(Note: this action is associated to the POST '/blog/post/:id' route)

I included in the comment form also a simple captcha (basically a math-
formula where the user should write the result for)
In case of error I would like to redirect to the article page and
display a notice, so I do a redirect_to and the flash is displayed and
everything is fine.

Now here it is my problem: when there is an error I would like the
redirect_to preserve the comment data entered by the user.
Right now, after the error (for example by failing the captcha) the
user is redirected to the article page and presented with an empty
form (that's obvious because the show_by_id action does a @comment =
Comment.new).
But I would like the form to be re-filled with the previously written
data and to spot the where is the problem.

To do so, I should in some way pass the comment data to the show_by_id
action so that the @comment variable can be initialized with these
data and presented in the form.

Any idea about how can I do this?

Thank you,
Fabio

To do so, I should in some way pass the comment data to the show_by_id
action so that the @comment variable can be initialized with these
data and presented in the form.

Typically one does that by rendering the edit/create form again rather
than redirecting.

Fred

Thank for your help.
So basically I created a method that fills all the needed variables
and I call it from both the show_by_id and create_comment actions.

However, now I have another question :slight_smile:
The comment form is located at the end of the page. So basically, when
the user submit a comment, I would like the page to be scrolled down
to the 'comment_form' anchor (i.e., where flashes are currently
displayed)

I tried with this:
form_for(@comment, :url => { :anchor => 'comment_form'})
but doesn't seem to work.

I think that the only solution to this is to put the flash zone at the
beginning of the page, but maybe that there is some technique to get
this behavior*.

Any other idea? :slight_smile:

Thanks again,
Fabio

* Actually this behavior would be handy to scroll the page to the
inserted comment in order to present it to the user for giving him a
success feedback.

If you are redirecting the user somewhere upon creation of the comment
then that redirect should specify the anchor.

Fred

As you previously suggested I am not using redirection anymore, but I
render the whole post page.

My action basically does this: http://pastie.org/281283
And this is my 'show' view: http://pastie.org/281286

So I need to show the user the page starting from the 'comment_form'
anchor as a result of the rendering.

Thanks,
Fabio

You've still got a redirect in the success case.
redirect_to(:back, :anchor => 'comment_form') }

won't actually use that anchor at all (the :back option wins).

Also check that the html of the document looks right.

Fred