Have a look at this line in the "preview" action of my example:

        render :action => 'new' unless @post.valid?

This will run all of the validations on the model, and if it's not  
valid, it will render the "new" view with the errors. Otherwise, it  
will render the preview page if everything is valid.

Also, you mentioned running "@posting.validate"... make sure you  
instead use "@posting.valid?" since "validate" is a private method.

- Nolan

On Jul 15, 2008, at 12:36 PM, liquid_rails wrote:

>
> 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
-~----------~----~----~----~------~----~------~--~---

Reply via email to