2011-03-06 9 views
5

Tengo un SettingsController con acciones cuenta y perfil, y también una actualizaciónque se parece a:Render la acción que inicia la actualización

def update 
    @player = current_user 
    if @player.update_attributes(params[:player]) 
     flash[:success] = "Profile updated." 
     redirect_to :back 
    else 
     @title = "Edit" 
     render 
    end 
end 

Ahora el perfil y la cuenta de acciones tienen cada uno una vista correspondiente, con una forma de editar algunos registros del modelo de Jugador.

Cuando intenta guardar uno de esos formularios, y falla, es decir. no pasó la validación, debe volver a mostrar la acción que inició la actualización, por lo que puede mostrar los mensajes de error apropiados.

Pero el problema es, ¿cómo sé cuál de los dos solicitó la actualización y la hizo la correcta? Básicamente, un tipo de equivalente de redirect_to: back es lo que estoy buscando aquí.

Respuesta

18

Ésta es feo, pero funciona :)

render Rails.application.routes.recognize_path(request.referer)[:action] 
+9

Eres un científico loco. – tadman

+1

... Supongo que es un cumplido :) – apneadiving

+0

¡Tienes razón, esto es feo ..! Pero si funciona ... ¿Sabes si ha surgido algo nuevo desde 2011? ¡¡¡Gracias!!! – Cedric

-1

Por lo general, esto se puede solucionar mediante la aplicación de un patrón:

def edit 
    @title = "Edit" 

    # ... 
end 

def update 
    # Update using the exception-generating variant 
    @player.update_attributes!(params[:player]) 

    # ... More actions if successful 

rescue ActiveRecord::RecordInvalid 
    self.edit 
    render(:action => 'edit') 
end 

Esto se simplifica a menudo por tener un before_filter que trata la carga del modelo instancia para ti.

Dado que este puede ser utilizado mucho, a veces se puede envolver que en un método de delegación:

def fallback_render(action) 
    send(action) 
    render(:action => action) 
end 
Cuestiones relacionadas