44 Stimmen

Umleitung der Root-URL an eine andere Stelle in der Rails-Anwendung

Ich habe Routen wie diese:

map.namespace 'prepayments', :path_prefix => '/:locale/prepayments'  do |prepayment|
  prepayment.root  :controller => 'login', :namespace => 'prepayments'
  ...
end

map.redirect '/', :controller => 'prepayments/login' # this is not working
# I tried also
map.root :controller => 'prepayments/login'

Was ich gerne hätte, ist, dass ich nach der Eingabe von: www.example.com auf www.example.com/en/prepayments weitergeleitet werde.

Früher, als ich noch map.root aus obigem Beispiel blieb es einfach bei www.example.com und renderte die korrekte Ansicht (aber es war ohne :locale und es hat gut funktioniert), später habe ich :locale zu meinen Routen und seit dieser Zeit funktioniert meine Ansicht (die ein Formular verwendet) nicht mehr richtig. Ich erhalte die Fehlermeldung, dass die entsprechende Route für das Formular nicht gefunden werden kann - was richtig ist, da ich keine :locale .

Wie kann man Root also auf eine andere Seite umleiten? Es wird wahrscheinlich brauchen, um den richtigen Pfad zu generieren und übergeben Sie es durch http 302. Oder/und wie man etwas wie zu machen:

map.root :controller => 'prepayments/login', :my_locale => 'en'

EDIT: Meine Rechentrassen sehen so aus:

         prepayments_root  /:locale/prepayments               {:controller=>"prepayments/login", :action=>"index"}
       prepayments_create  /:locale/prepayments/send_email    {:method=>:post, :controller=>"prepayments/login", :action=>"send_email"}
         prepayments_home  /:locale/prepayments/home          {:controller=>"prepayments/prepayments", :action=>"home"}
         prepayments_save  /:locale/prepayments/save          {:controller=>"prepayments/prepayments", :action=>"save"}
        prepayments_agree  /:locale/prepayments/agree         {:controller=>"prepayments/prepayments", :action=>"agree"}
     prepayments_disagree  /:locale/prepayments/disagree      {:controller=>"prepayments/login", :action=>"logout"}
      prepayments_payment  /:locale/prepayments/payment       {:controller=>"prepayments/prepayments", :action=>"payment"}
prepayments_payment_email  /:locale/prepayments/payment_email {:controller=>"prepayments/prepayments", :action=>"payment_email"}
                           /:locale/prepayments/:uid          {:controller=>"prepayments/login", :action=>"verify"}
                 redirect  /                                  {:controller=>"prepayments/login", :action=>"index"}

EDIT:

Ich habe versucht, es so zu machen, wie Garrett es vorgeschlagen hat, und es hat funktioniert. Ich habe die Routen geändert:

map.redirect '/', :controller => 'prepayments/login', :action => 'welcome'

und fügte die Methode welcome in den Controller ein:

def welcome
  redirect_to prepayments_root_path(:locale => 'en')
end

Und es funktioniert so, wie ich es wollte (d.h. es ändert die URL in meinem Browser).

Die andere Möglichkeit ist, die Route so zu ändern:

map.root :controller => 'prepayments/login', :locale => 'en'

Es funktioniert auch, aber es wird nicht weitergeleitet (die URL im Browser wird nicht geändert). Ich bin nicht sicher, ob es eine solche Option gibt wie map.redirect . Ich habe es in den Beispielen auf www gefunden, aber ich habe auch Plugins gefunden, die diese Funktionalität hinzufügen.

Danke für die Hilfe!

157voto

Shaun McDonald Punkte 6156

In Rails 3 können Sie schreiben:

root :to => redirect('/prepayments')

Die folgende Seite bietet eine gute Einführung in die Durchführung dieser Umleitungen in Rails 3: http://www.railsdispatch.com/posts/rails-routing

4 Stimmen

Hier wird eine permanente 301-Weiterleitung verwendet. Wie würden Sie eine temporäre 302-Weiterleitung durchführen?

1 Stimmen

Ich stimme @DerekDahmer zu! Wie macht man eine 302 aus der routes.rb. Ich habe versucht, den Status einzugeben: 302, aber keine Freude.

1 Stimmen

Können Sie sehen, ob diese Antwort den Zweck erfüllt? stackoverflow.com/a/19138779/99266

39voto

glasz Punkte 2469

Umleitungsoptionen scheinen nicht zu sein dokumentiert zu gut.
Bitte sehr (@derek, siehe letztes Beispiel):

Umleitung zu einer Subdomain auf der Domäne der aktuellen Anfrage

root to: redirect(subdomain: 'foo', path: '/bar') # => foo.example.com/bar

Umleitung mit Ersatzparametern aus der entsprechenden Route

get 'stores/:name(*all)', to: redirect(subdomain: 'stores', path: '/%{name}%{all}')

Umleitung mit Statuscode (z.B. 302 statt Standard 301)

redirect(path: '/foo', status: 302)

Umleitung mit einem bedingten Block

redirect(status: 302) { |params, request|
  case request.host
  when 'localhost'
    '/foo'
  when /example.com$/
    '/bar'
  else
    '/baz'
  end
}

-1voto

Jeremy Punkte 1502

In Rails 4 (4.2.0 in meinem Fall), fügte ich dies: match "*path" => "main#index", :via => [:get, :post] a app/config/routes.rb .

Um herauszufinden, was Sie anstelle der folgenden Punkte einsetzen sollen main . Schauen Sie in diese Datei: app/controllers/main_controller.rb . Auch hier gilt, dass Ihre nicht genannt werden dürfen. main_controller.rb aber es wird sein something_controller.rb wahrscheinlich NICHT application_controller.rb o servers_controller.rb . In dieser Datei finden Sie einen Code, der wie folgt aussieht:

class MainController < ApplicationController
  def index
    render :layout => "angular"
  end
end

Wo es eine MainController Anhand der Fehlermeldung, die Rails in Ihrem Browser ausgibt, sollten Sie erkennen können, was Sie von hier aus tun müssen. Einfach ersetzen Haupt en match "*path" => "main#index", :via => [:get, :post] mit dem jeweiligen Präfix des Controllers.

Ich hoffe, das macht Sinn. Ich bin ein Ruby-Anfänger als gut

-8voto

Garrett Punkte 7502

Sie müssen den Controller auf einen Welcome oder was nicht, dann, wenn dass Controller getroffen wird, wird er auf die gewünschte Route umleiten. Vielleicht Rails 3 Routing wird besser für Sachen wie diese sein, aber für jetzt, müssen Sie eine Haupt Root-Controller haben.

0 Stimmen

Aber wie fügt man den Parameter :locale zu redirect_to prepayments_root_path hinzu?

0 Stimmen

Ich weiß, ich kann es mit einigen String vor, aber gibt es einen schöneren Weg hinzufügen?

0 Stimmen

Können Sie die Ergebnisse Ihrer rake routes ?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X