views:

2408

answers:

2

How can I render after executing an action in a restful controller instead of redirecting.

I have a controller with standard actions, and I added a special action that adds data to the resource in question, via a form on the #show page (Think comments on a post). I am validating the input from the form and want to re-render the show action on error and redirect to the show action on success.

I want to render to save the user from inputting their info twice, but when I try to render the show action with an error in the flash[:notice] I get an error saying that I am not specifying an ID. When I do specify an ID, it tries to render a new template that doesn't exist yet.

I am thinking that it should be a as simple as:

def add_comment
  if my_validation?
    save the object
    redirect_to :action => "show", :id => params[:id]
  else
    render :action => "show", :id => params[:id]
  end
end

This is not my actual code, just something I put together just now as an example.

+2  A: 

The best way is to re-render the :new

def create
  @obj = TheObject.new(params[:object])
  render :action => :new unless @obj.save
end

And in the new.html.erb

<% form_for :obj, 
  :url => object_url(@obj), :html => {:method => :post} do |f| %>

  <%= f.text_field :name %>
<% end %>

That way, the inputs in the form will be pre-filled with what the user entered.

dan
A: 

Create a new data object and add the values from the form, before you rerender, think it would work then. If you still get problems, try setting a boolean for editing new vs. existing rows, or create two different views entirely.

I've done it before but I don't quite remember how. Sometimes when I used the very typical use of the MVC pattern, it was allmost "automagical", othertimes (as I had to use an old quirky database) I had to code all the magic myself; sometimes usin the .new? function (or what it was called) on the ActiveRecord object, othertimes I used temporary "magic values" for ID (typically alphabetic strings for invalid id values.

(I appologize if I made some mistakes, it's a while since I coded Rails code...)

Stein G. Strindhaug