40

私はこのようなルートを持っています:

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'

www.example.comと入力すると、www.example.com / en/prepaymentsにリダイレクトされます。

上記の例から使用したときmap.rootは、www.example.comにとどまり、正しいビューをレンダリングしました(ただし、表示されなかったため、正常:localeに機能しました)。後でルートに追加:localeしました。この時点から、ビュー(何らかのフォームを使用)は追加されません。正しく動作しません。フォームに対応するルートが見つからないというエラーが表示されます。これは、を渡さなかったため:localeです。

では、rootを別のページにリダイレクトする方法は?おそらく正しいパスを生成し、それをhttp302に渡す必要があります。または/そして次のようなものを作成する方法:

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

編集:私のレーキルートは次のようになります:

         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"}

編集:

ギャレットが提案した方法でやってみたところ、うまくいきました。ルートを変更しました:

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

コントローラにウェルカムメソッドを追加しました。

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

そしてそれは私が望むように動作します(それでそれは私のブラウザのURLを変更します)。

もう1つの方法は、次のようにルートを変更することです。

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

それも機能しますが、リダイレクトされません(ブラウザのURLは変更されません)。のようなオプションがあるかどうかはわかりませんmap.redirect。wwwの例で見つけましたが、そのような機能を追加するプラグインも見つけました。

手伝ってくれてありがとう!

4

4 に答える 4

151

Rails 3では、次のように書くことができます。

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

次のページには、Rails3でこれらのリダイレクトを実行するための優れた紹介があります。http ://www.railsdispatch.com/posts/rails-routing

于 2011-09-02T16:53:10.487 に答える
38

リダイレクトオプションはあまり文書化されていないようです。
ここに行きます(@derek、最後の例を参照):

現在のリクエストのドメインのサブドメインにリダイレクトする

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

一致したルートからの置換されたパラメータでリダイレクト

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

ステータスコードでリダイレクトします(例:デフォルトの301ではなく302)

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

条件付きブロックでリダイレクト

redirect(status: 302) { |params, request|
  case request.host
  when 'localhost'
    '/foo'
  when /example.com$/
    '/bar'
  else
    '/baz'
  end
}
于 2013-08-02T12:51:32.400 に答える
0

Rails 4(私の場合は4.2.0)で、これをに追加しましmatch "*path" => "main#index", :via => [:get, :post]app/config/routes.rb

の代わりに何を置くべきかを知るためmain。このファイルを見てください:app/controllers/main_controller.rb。繰り返しますが、あなたは呼ばれないかもしれませんmain_controller.rbsomething_controller.rb、おそらくそうではない application_controller.rbでしょうservers_controller.rb。そのファイルには、次のようなコードが含まれています。

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

MainControllerがある場合、railsがブラウザにここから何をすべきかを提供するというエラーメッセージでわかるはずです。maininmatch "*path" => "main#index", :via => [:get, :post]をコントローラーのプレフィックスに置き換えてください。

これが理にかなっていることを願っています。私もルビー初心者です

于 2015-04-14T06:41:28.920 に答える
-7

Welcomeコントローラをaまたはnotに設定する必要があります。その場合、そのコントローラがヒットすると、目的のルートにリダイレクトされます。たぶん、Rails 3ルーティングはこのようなものに適していますが、今のところ、メインルートコントローラーが必要になります。

于 2010-01-14T18:28:23.467 に答える