Passing Parameters to a Re-Rendered View

Please consider a CRUD action and view for modifying a record. The
form for making the modification is called by the URL, "http://
www.mydomain.com/members/modify/5". This calls the "modify" action of
the "members" controller and passes the :id parm of "5". The action
uses the :id param to retrieve the appropriate record which is passed
to the view in the @member instance variable. The view uses the data
provided in @member to pre-populate the form with the current values.
The user uses the form to make any desired modifications to the
current values and submits the form to another action which saves the
updated data and redirects the user to another URL.

Under normal circumstances the above works just fine. If, however,
the form is validated and there is a validation error; then, the
original form needs to be re-rendered with error messages. The
problem is that, as far as I can see, 'render' does not allow params
to be passed to the view; so, in this second rendering of the form,
the form doesn't have any data to pre-populate the fields.

My question is: How do I pass the parameters to the re-rendered
view? In fact, now that I think about it, how are parameters normally
passed to a rendered view. I would think that it would all be the
same process.

Thanks for any input.

          ... doug

Doug Jolley wrote:

Please consider a CRUD action and view for modifying a record. The
form for making the modification is called by the URL, "http://
www.mydomain.com/members/modify/5". This calls the "modify" action of
the "members" controller and passes the :id parm of "5". The action
uses the :id param to retrieve the appropriate record which is passed
to the view in the @member instance variable. The view uses the data
provided in @member to pre-populate the form with the current values.
The user uses the form to make any desired modifications to the
current values and submits the form to another action which saves the
updated data and redirects the user to another URL.

Under normal circumstances the above works just fine. If, however,
the form is validated and there is a validation error; then, the
original form needs to be re-rendered with error messages. The
problem is that, as far as I can see, 'render' does not allow params
to be passed to the view; so, in this second rendering of the form,
the form doesn't have any data to pre-populate the fields.

My question is: How do I pass the parameters to the re-rendered
view? In fact, now that I think about it, how are parameters normally
passed to a rendered view. I would think that it would all be the
same process.

Thanks for any input.

          ... doug

Doug, if I understand you correctly, your pre-population doesn't seem to
hold values when validation fails during an update?.

How do you prepopulate the values?. Using form events?

Doug, if I understand you correctly, your pre-population doesn't seem to
hold values when validation fails during an update?.

How do you prepopulate the values?

There are two controller actions involved. Initially, the first
action is called with a URL like, "http://www.mydomian.com/members/
modify/5". Thus, this action receives the id of the relevant record
in the URL (in this case, '5'). This action uses that id to retrieve
the relevant record object and assigns it to the @member instance
variable. This action then renders the form view which uses the
@member instance variable to prepopulate the fields. The user makes
any desired changes to the prepopulated form values and then submits
the modified form data to the second controller action. The second
action creates a new record from the submitted form data; and, absent
any validation errors saves it. If there are validation errors, the
original form needs to be re-rendered but this time there is no
@member instance variable for it to use to prepopulate the fields.
That's the problem. Is that more clear?

Thanks for the help.

         ... doug

Assuming that the action to update the record (ie the action receiving
the form) is called update then normally this would look something
like:

  def update
    @member = Mamber.find(params[:id])

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

so @member is populated appropriately for the re-display of the edit action

Colin

Thanks for the input.

I haven't actually tried it yet; but, I don't think that it's going to
work.

I'm not sure that I'm totally onboard with your condition statement:

if @member.update_attributes(params[:member])

but, let's just assume that it works. We're really only interested in
the case where the condition isn't satisfied and only the else clause
is executed. When that happens the following gets executed:

render :action => "modify"

That's exactly what I was dealing with and the problem is that within
update the @member instance variable is not defined so that it can be
used by the view in populating the form fields.

Thanks for the suggestion though.

            ... doug

Perfect! I get it. I guess it's just a case of getting one's head
screwed on correctly.

Thanks a batch.

          ... doug

If you use the scaffold generator for generating things in the first
place then skeleton methods will be provided for you to do the basic
CRUD stuff that you can then adjust to your requirements. For example

script/generate scaffold MyModel name:string title:string content:text

See the RoR getting started guide for more info.

Colin

If you use the scaffold generator for generating things in the first
place then skeleton methods will be provided for you to do the basic
CRUD stuff that you can then adjust to your requirements.

Thanks, Colin. I'm aware of that. In fact, I think that I may
actually have started with the scaffold.

You may recall that my original inquiry in this topic was posted in
another thread and I botched that post to the point where I needed to
start over. Anyway, in that post, I pointed out that I was trying to
do some consolidation of similar actions and views. I'm not sure
that you thought that was a good idea. In any event, my point is that
what I was dealing with may have been a morphed scaffolding.

Whatever, I do appreciate your taking the time to square me away on
this issue. Thanks for the help.

          ... doug

Hi Doug,

I was doing some reading yesterday and remembered the problem you were
having. One thing I didn't mention before, and haven't seen in the
thread, that might help you is the flash hash. One of it's intended
uses is to allow the 'persistance' of stuff like error messages between
redirects. @errors doesn't survive, but if you assign them to the flash
hash before you do the redirect, they'll be there for use in that view.

HTH,
Bill

Hi, Bill --

The flash thing has been mentioned somewhere along the way; but, it
was not recommended for this purpose. In fact, the thing is that for
this purpose it's not needed if one has their head screwed on
correctly. (Obviously I didn't! :slight_smile: ) However, there is no doubt
about it, the flash hash is an invaluable tool for passing values
around. Thanks for mentioning it.

          ... doug