2012-04-01 16 views
9

Tengo un formulario con control remoto => true. Y en este momento mi regulador parece:redireccionar después exitosa forma ajax

# POST /items 
    # POST /items.json 
    def create 
    @item = @store.items.build(params[:item]) 

    respond_to do |format| 
     if @item.save 
     format.html { redirect_to edit_admin_item_path(@item), :flash => {:success => "#{@item.name} was successfully created."} } 
     format.js { render :js => "window.location.href = ('#{edit_admin_item_path(@item)}');"} 
     format.json { render json: @item, status: :created, location: @item } 
     else 
     format.html { render action: "new" } 
     format.js { render :partial => 'fail_create.js.erb', :locals => { :ajax_errors => @item.errors.full_messages } } 
     format.json { render json: @item.errors, status: :unprocessable_entity }  
     end 
    end 
    end 

que funciona, pero se siente muy torpe. Tampoco me permite usar un aviso de flash, que es un momento lamentable.

Idealmente me siento que debería ser capaz de utilizar simplemente "format.js {...} redirect_to o cheque contra las cabeceras de petición y redirect_to. Joder!

no estoy seguro de cuál es la mejor solución es . Cualquier consejo sería súper increíble, gracias de antemano!

- PD - Sé que esto se ha preguntado un poco antes, pero fue en vano: How to redirect after a successful AJAX form submission. Parece que hay muchas preguntas similares flotando, pero no hay soluciones reales.

+0

Quizás me falta algo, pero ¿no es el objetivo de la presentación de formularios AJAX que * no * requiere una carga de página? Si vas a redirigir, ¿no podrías hacer un envío a la antigua? – jimw

+0

El ajax se usa para verificar la validación y los registros duplicados. Luego actualiza el con un mensaje de error. Cuando el formulario es correcto, quiero redireccionar al edit_path. Que tiene carga de imágenes y otras cosas pasando. – Galaxy

+0

Correcto, pero puede hacer la validación de formulario JS sin el envío de AJAX. La única razón por la que sé enviar a través de AJAX es evitar una carga de página. – jimw

Respuesta

5

creo que podría ser imposible. La respuesta a una solicitud de Ajax es procesada por XMLHttpRequest. Si se devuelve una respuesta 3xx, XMLHttpRequest seguirá el redireccionamiento, si la URL es del mismo origen. No importa cómo establezca los encabezados, el navegador no puede ser consciente de eso. Entonces, la única forma podría ser cambiar window.location con JavaScript.

+0

Configurar encabezados era lo que originalmente quería ser capaz de hacer. Parece que no se puede hacer! – Galaxy

+2

Establecer encabezados no es la forma de los rieles; por lo tanto, no recomendaría ir por esa ruta. –

+0

Llegué tarde, actualmente estoy usando 'make_resourceful' pero no puedo redireccionar al usuario al lugar correcto después de' create' va a 'show' siempre ya que no está ingresando en' response_for (: create) do | format | 'y sale. cualquier código de controlador de muestra? @AaronGray – LearningROR

3

Uso una combinación de Rails responders para generar mis mensajes de respuesta y algunos conten t en mi archivo <action>.js.

El contenido de - dicen update.js sería algo como esto:

// Checks if the article slug has changed. 
// If it has the entire page should be reloaded at that new location. 
<%= reload_if_slug_changed @article, params[:id] %> 

// Displays the flash notices 
// See ApplicationHelper#js_flash_response 
<%= js_flash_response %> 

donde se definen los diferentes métodos de algún ayudante (en mi caso mi ApplicationHelper). El contenido de los diferentes métodos son los siguientes:

def js_flash_response 
    if flash.now[:notice].present? 
    js = "$('#notice').html('#{flash.now[:notice]}').change();" 
    elsif flash.now[:alert].present? 
    js = "$('#alert').html('#{flash.now[:alert]}').change();" 
    end 
end 

def reload_if_slug_changed object, expected_value 
    "window.location.href = '#{url_for [:edit, object]}';" if object.slug != expected_value 
end 

El contenido de los mensajes flash son generado automáticamente por Rails responders y se visualiza con el alcance now que elimina el a partir del hash flash, asegurando que si las recargas de usuario (después de el flash se ha mostrado) no volverán a aparecer.

No creo que nunca deba hacer una forma que indique que una acción create relajada es remota, porque siempre esperaría una redirección crítica, por lo que en mi caso solo necesito redirigir si la barra url ha cambiado.

Espero que esto ayude. No es una solución, sino simplemente la forma en que manejé algunos de los mismos problemas.

Saludos cordiales.

3

Bajo su escenario, así es como inyectaría javascript en la página desde una acción del controlador. Después de haber completado la sección lógica de la acción de inserción o menos así:

render :update do |page| 
    page << "javascript_here" 
end 

Esto debería permitir que inserte se window.location o crear un método de flash javascript y lo llama cuando su creación método ejecuta correctamente.

Si desea DIVIDIR las acciones de su controlador, le recomiendo consultar this Railscast about make_resourceful. Make_resourceful realiza automágicamente cada actividad principal para cada acción.También le permite acceder a los ganchos que han creado, como before :create, after :create, response_for :create y after :create_fails. Al usar esta gema, puede ejecutar código en función del éxito o el fracaso de sus métodos y tener un control más detallado sobre ellos.

Además de esto, debería poder inicializar create.js.erb y create_fails.js.erb en su archivo de vista, incluir un formato.js sin que se le pase nada en su controlador, y Rails automaticamente ejecuta ese archivo que contiene javascript dependiendo de si la acción del controlador se ejecutó correctamente.

Cuestiones relacionadas