Use custom route when model validation fails

I just added a contact form to my Rails application so that site visitors can send me a message. The application has a resource Message, and I defined this custom route to make the URL more enjoyable and understandable:

map.contact '/contact', :controller => 'messages', :action => 'new'

How can I save the URL as /contactwhen the model failed validation? The URL is currently changing to /messagesafter verification failed.

This is the method createin my messages_controller:

def create
  @message = Message.new(params[:message])

  if @message.save
    flash[:notice] = 'Thanks for your message etc...'
    redirect_to contact_path
  else
    render 'new', :layout => 'contact'
  end
end

Thanks in advance.

+4
source share
4 answers

One solution would be to make two conditional routes with the following code:

map.contact 'contact', :controller => 'messages', :action => 'new', :conditions => { :method => :get }
map.connect 'contact', :controller => 'messages', :action => 'create', :conditions => { :method => :post } # Notice we are using 'connect' here, not 'contact'! See bottom of answer for explanation

, ( ..) "" , post - "". ( : put delete, .)

, ,

<%= form_for @message do |f| %>

<%= form_for @message, :url => contact_url do |f| %>

( , .)

.

( , . .)

.

  • , map.name_of_route JUST THE PATH. . , . , , , .

.

, ( ), . ( ), .

def map.connect_different_actions_to_same_path(path, controller, request_types_with_actions) # Should really change the name...
  first = true # There first route should be a named route
  request_types_with_actions.each do |request, action|
    route_name = first ? path : 'connect'
    eval("map.#{route_name} '#{path}', :controller => '#{controller}', :action => '#{action}', :conditions => { :method => :#{request.to_s} }")
    first = false
  end
end

:

map.connect_different_actions_to_same_path('contact', 'messages', {:get => 'new', :post => 'create'})

, ...

+8

, .

map.resources :messages, :as => 'contact'

( )

/contact # + GET = controller:messages action:index
/contact # + POST = controller:messages action:create

, "" "", . . .

, , , "" .

Btw. ,

map.resources :messages, :as => 'contact', :collection => { :manage => :get }

manage_messages_path # = /contact/manage controller:messages action:manage

.

+1

, / , , , URL-.

, :

def create
  @message = Message.new(params[:message])

  if @message.save
    flash[:notice] = 'Thanks for your message etc...'
    redirect_to contact_path
  else
     flash[:notice] = 'Sorry there was a problem with your message'
    redirect_to contact_path
  end
end
0

, . im , , @message, , .

, , , , :

before_filter :find_message_in_session, :only => [:new]

def new
  @message ||= Message.new
end

def create
  @message = Message.new(params[:message])
  if @message.save
    flash[:notice] = 'Thanks for your message etc...'
    redirect_to contact_path
  else
    flash[:notice] = 'Sorry there was a problem with your message'
    store_message_in_session
    redirect_to contact_path
  end
end

private

def find_message_in_session
  @message = session[:message]; session[:message] = nil
end

def store_message_in_session
  session[:message] = @message
end
0

All Articles