Je suis un peu un problème noob. Je voulais obtenir du congé à rediriger vers la dernière page de l'utilisateur visité. Donc, j'ai fait ce qui suit ... fonctionne génial ... sauf si l'utilisateur se connecte réellement via le formulaire d'origine qui provoque une boucle de redirection. p> J'ai essayé p> mais cela ne fonctionne pas, probablement parce que je n'ai aucune idée de quelle demande.Referer revient réellement lorsqu'il rencontre la connexion de l'utilisateur d'origine. page (www.example.com/users/sign_in). TLDR; Utilisation du congé, je veux rediriger vers la page connectée à partir de (c.-à-d. / Blog / 4) sauf si la page est / user / utilisateurs / signe_in p> Matchu avait raison. La requête.referer renvoyait le domaine aussi ... p> (Remarque: pas de préfixe www) p> Je suis toujours intéressé par une alternative Demander.referer si c'est une manière non sécurisée ou inefficace. P> p>
4 Réponses :
Ne pas rediriger vers les référenciers - c'est généralement une mauvaise idée.
à la place, passez un Lorsqu'un utilisateur tente de visiter une page nécessitant une authentification (par exemple, suivant code> de la valeur de la chaîne de requête ou du formulaire. Peut-être utiliser quelque chose comme: p>
/ admin / message / 3 / modifier / modifier code>) le authentification
avant_filter code> Problème A
redirect_to new_session_url (: suivant => demande.path) code>. Puis cochez l'action de connexion et affiché pour préserver le paramètre
: suivant code> de la chaîne de requête. P> p>
Pas sûr de ce que vous voulez dire. Comme une entrée cachée: ensuite contenant l'URL actuelle?
Je vais marquer la justice comme la réponse acceptée à moins que l'une ou l'autre Matchu puisse republier comme une réponse ou une justice peut expliquer davantage une alternative à la demande. Riferer
Que diriez-vous:
def after_sign_in_path_for(resource) sign_in_url = url_for(:action => 'sign_in', :controller => 'users', :only_path => false, :protocol => 'http') if (request.referer == sign_in_url) super else request.referer end end
Cela a fonctionné pour moi. Je devais changer la deuxième ligne en "signe_in_url = url_for (: action =>" nouveau ",: contrôleur =>" sessions ',: seulement_path => false,: protocole => "http')"
J'ai pris la réponse de la justice et j'ai changé pour utiliser des sessions à la place.
Autant que je puisse le constater, les sessions sont plus simples, puis ajoutent l'URL comme param, mais ils pourraient se comporter inattendu lorsqu'un utilisateur navigue dans plusieurs onglets. , par exemple. L'utilisation de sessions est moins reposante, mais plus simple et plus propre. P>
Lorsque vous utilisez CANCAN, le réglage de la trajectoire de redirection peut être effectué dans un endroit central: l'endroit qui gère les exceptions "Access refusé": P> mais vous pouvez définir ceci n'importe où, réellement: p> puis, dans applicationController code>, vous pouvez re -Utilisez cette valeur de session. Assurez-vous de le retirer aussi, cependant. P>
def after_sign_in_path_for(resource)
path = ''
if session[:next]
path = session[:next]
session[:next] = nil
else
path = super
end
path
end
Voici mon code à Rescue_from CODE> CANCAN.
rescue_from CanCan::AccessDenied do |exception|
if current_user.nil?
session[:next] = request.fullpath
puts session[:next]
redirect_to login_url, :alert => "You have to be logged in to continue"
else
#render :file => "#{Rails.root}/public/403.html", :status => 403
if request.env["HTTP_REFERER"].present?
redirect_to :back, :alert => exception.message
else
redirect_to root_url, :alert => exception.message
end
end
end
Le référateur contient probablement le nom de domaine: /
Cela fonctionne assez bien pour moi: Stackoverflow.com/questions/5255283/...