Rails 3: Comment “redirect_to” en appel Ajax?
Suivantes attempt_login
méthode est appelée à l'aide d'Ajax après un formulaire de connexion est soumis.
class AccessController < ApplicationController
[...]
def attempt_login
authorized_user = User.authenticate(params[:username], params[:password])
if authorized_user
session[:user_id] = authorized_user.id
session[:username] = authorized_user.username
flash[:notice] = "Hello #{authorized_user.name}."
redirect_to(:controller => 'jobs', :action => 'index')
else
[...]
end
end
end
Le problème est que redirect_to
ne fonctionne pas.
Comment voulez-vous résoudre ce problème ?
Vous devez vous connecter pour publier un commentaire.
Enfin, je viens de remplacer
avec ceci:
et il fonctionne très bien!
eval
appel sur le client?render :js => "window.location = '#{jobs_path}'"
jobs_path
fondamentalement aussi rigide que l'URL? Si l'URL change, ce serait le nom de la route, sauf si vous êtes très prudent. Une autre alternative seraitrender js: "window.location = '#{polymorphic_path(@job.class)}'"
et calculée ingénieux route, basés sur le Travail de modèle. Cela ne fonctionne que si vos routes sont débrouillards et utiliser les conventions de nommage qui s'alignent avec vos modèles. (Ou si vous spécifiez model_name sur vos modèles afin qu'ils produisent de la route à droite des noms.)Il est très facile de garder le flash pour la prochaine requête. Dans votre contrôleur de faire quelque chose comme
La
flash.keep
sera assurez-vous que le flash est gardé pour la prochaine requête.Ainsi, lorsque le
root_path
est rendu, il affichera le message flash. Rails est génial 🙂Je pense que c'est un peu plus sympa:
render js: "window.location.pathname='#{jobs_path}'"
render js: "window.location.pathname = #{jobs_path.to_json}"
Dans une de mes applications, j'utilise JSON à effectuer sur la redirection, et le flash de message de données. Il ressemblerait à quelque chose comme ceci:
Et jQuery simple exemple serait:
Combinant le meilleur de toutes les réponses:
Je n'ai pas envie de modifier mon contrôleur actions alors je suis venu avec ce hack: