views:

27

answers:

3

Hello, When I:

self.save

or

save!

in a model it automatically redirects me to the show view for that given model. How can I override this? I want to save the model and then go to another action/view in the same controller.
In particular, I have a process where I save a members details, and then I want to continue the process by going to the next page, e.g. payment page, that uses the id of the saved model.

+1  A: 

You likely have a block like this in your create/update methods:

    respond_to do |format|
      if @post.save
        format.html { redirect_to(@post, :notice => 'Post was successfully created.') }
        format.xml  { render :xml => @post, :status => :created, :location => @post }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @post.errors, :status => :unprocessable_entity }
      end
    end

So if your instance variable is named @post, and it's redirecting to the show view for the post after it saves, all you have to do is change the "redirect_to(@post, ..." part to whatever you want. Say you wanted to redirect to the root of your site - you could instead have

redirect_to(root_path, :notice => 'Post was successfully created.')

In your particular case, you could use something like this if you have your routes set up:

redirect_to(payment_page_path(@post), :notice => 'Post was successfully created.')

Hope that helps!

codykrieger
+1  A: 

In your controller you might have a block like:

def create
  @user = User.new(params[:place])

  respond_to do |format|
    if @user.save
      format.html { redirect_to(@user, :notice => 'User was successfully created.') }
      format.xml  { render :xml => @user, :status => :created, :location => @user }
    else
      format.html { render :action => "new" }
      format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
    end
  end
end

You can change the target of the redirect_to (after format.html) from here - at present it is directing you to the record for that user, ie. @user. Take a look at http://api.rubyonrails.org/classes/ActionController/Base.html for a bit more info.

Sonia
I did look in the controller but I was redirecting to a new page... hmm... I'll search it out.
aaronmase
+1  A: 

if you call save from your Model you will not be directed anywhere, it just does a direct model access save to the database. Your redirections are described in your controller in your create and update actions. you can find a list of routes by running rake routes and then pick the path you want your app to render when you save your model instance. you may have a route called payment_path which might look like this in your controller

map.payment :controller => :payments_controller, :action => index

and you would say in your create action

def create
  if @item.save(params[:item])
    redirect_to payment_path 
  else
    flash[:error] = "there was a problem"
    render :action => buy
  end
end

if you need to pass a param, like user id to your route, then you need to include that in the path parameters

redirect_to payment_path(@user) #=> automagically finds the id of active record models
Jed Schneider