Hi Nolan,
The only problem with this is approach is that I want to validate the
posting before previewing it. The only way that I know of to do this
is by saving it first, and then rendering the new action to display
the form along with the errors. However, as suggested above, I should
be able to call @posting.validate and do the same thing without having
to save the post first.
Thanks for your help,
Cheri
On Jul 15, 11:30 am, Nolan Meyers <[EMAIL PROTECTED]> wrote:
> Since you only want it to save after previewing, why not just add a
> "preview" action with hidden form fields on the page? For example:
>
> class PostsController < ApplicationController
> def new
> @post = Post.new(params[:post])
> end
>
> def preview
> @post = Post.new(params[:post])
> render :action => 'new' unless @post.valid?
> end
>
> def create
> @post = Post.new(params[:post])
> if @post.save
> end
> end
>
> Add this to your routes.rb:
> map.resources :posts, :new => {:preview => :post}
>
> Finally, on the preview page, add hidden form fields with the post
> values so that they will get passed when the user confirms to save the
> record. If they want to edit it, you can either have it submit back to
> the new page or display a hidden form.
>
> The benefit of taking this route is that you're only saving the
> records after confirmation. Also, if you implement an api later the
> preview action can just be skipped.
>
> - Nolan
>
> On Jul 15, 2008, at 11:14 AM, liquid_rails wrote:
>
>
>
> > Hi Patrick,
>
> > I would prefer to have the preview on a separate page, so that if the
> > object is validated, the user is sent to the preview page, and it it
> > is not, the user is sent back to the form by using "render :action =>
> > 'new'", which will display the form + errors. On the preview page,
> > there would be a choice to continue and agree to terms and conditions
> > or to edit the post. The easiest way I see to do this is to actually
> > create the post, and then if the user does not press continue or agree
> > to the terms and conditions, delete the posting from the database.
> > However, this would require a lot of unnecessary calls to the database
> > (if there is a way to store and pass a temporary object), and would
> > also cause posting id numbers to not be consecutive (say, if a user
> > does not commit to the post.) I'm tempted to go with this approach
> > because it is the easiest, however the inefficiency of this approach
> > scares me.
>
> > Cheri
>
> > On Jul 15, 10:55 am, Patrick Crowley <[EMAIL PROTECTED]> wrote:
> >> I would recommend using the standard save method here.
>
> >> If your controller is RESTFUL, it might look like this:
>
> >> class PostsController < ApplicationController
>
> >> def new
> >> @post = Post.new
> >> end
>
> >> def create
> >> @post = Post.new(params[:post])
> >> if @post.save
> >> flash[:notice] = 'Post was successfully created.'
> >> redirect_to(@post)
> >> else
> >> render :action => "new"
> >> end
> >> end
> >> end
>
> >> end
>
> >> Sometimes, I like to merge these two actions into one:
>
> >> class PostsController < ApplicationController
>
> >> def new
> >> @post = Post.new(params[:post])
> >> if request.post?
> >> if @post.save
> >> flash[:notice] = 'Post was successfully created.'
> >> redirect_to(@post)
> >> end
> >> end
> >> end
>
> >> end
>
> >> ....
>
> >> If you need to have a preview right there in the form, you could
> >> include a partial that contains the markup needed to display a post,
> >> and pass it your @post object.
>
> >> So, below your form, you would add this:
>
> >> <% if request.post && @post %>
> >> <%= :partial => "preview", :object => @post %>
> >> <% end %>
>
> >> Now, depending on your validation rules, displaying something that
> >> isn't valid could be kinda hairy, but you could find ways to work
> >> around that.
>
> >> -- Patrick
--~--~---------~--~----~------------~-------~--~----~
SD Ruby mailing list
[email protected]
http://groups.google.com/group/sdruby
-~----------~----~----~----~------~----~------~--~---