Die folgende attempt_login
Methode wird mit Ajax aufgerufen, nachdem ein Anmeldeformular gesendet wurde.
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
Das Problem ist, dass redirect_to
das nicht funktioniert.
Wie würden Sie das lösen?
ruby-on-rails
ajax
ruby-on-rails-3
redirect
Mischa Moroshko
quelle
quelle
render :js => "window.location = '#{jobs_path}'"
jobs_path
Grunde nicht so starr wie die URL? Wenn sich die URL ändert, ändert sich auch der Name der Route, es sei denn, Sie sind besonders vorsichtig. Eine andere Alternative wärerender js: "window.location = '#{polymorphic_path(@job.class)}'"
und die berechnete einfallsreiche Route basierend auf dem Jobmodell zu verwenden. Dies funktioniert nur, wenn Ihre Routen einfallsreich sind und Standard-Namenskonventionen verwenden, die mit Ihren Modellen übereinstimmen. (Oder wenn Sie model_name auf Ihren Modellen angeben, damit sie die richtigen Routennamen generieren.)Es gibt eine sehr einfache Möglichkeit, den Blitz für die nächste Anfrage zu behalten. Machen Sie in Ihrem Controller so etwas wie
Dadurch
flash.keep
wird sichergestellt, dass der Blitz für die nächste Anforderung beibehalten wird. Wenn dasroot_path
gerendert wird, wird die angegebene Flash-Nachricht angezeigt. Rails ist großartig :)quelle
Ich finde das etwas schöner:
render js: "window.location.pathname='#{jobs_path}'"
quelle
render js: "window.location.pathname = #{jobs_path.to_json}"
In einer meiner Apps verwende ich JSON, um die Umleitungs- und Flash-Nachrichtendaten fortzusetzen. Es würde ungefähr so aussehen:
Ein einfaches jQuery-Beispiel wäre:
quelle
Die besten aller Antworten kombinieren:
quelle
quelle
Ich wollte meine Controller-Aktionen nicht ändern, also habe ich mir diesen Hack ausgedacht:
quelle