为什么Rails应用程序意外重定向,而不是匹配的路线?(Why rails app is redir

2019-06-23 11:11发布

我问这个问题前面,并认为这是固定的,但事实并非如此。 前一个问题在这里

我的问题是我想设置我的路线,这样,当我输入

本地主机:3000 /网站/管理

应该重定向到

本地主机:3000 / EN /网站/管理

这里是我的routes.rb文件

scope ":locale", locale: /#{I18n.available_locales.join("|")}/ do
  get "log_out" => "sessions#destroy", as: "log_out"
  get "log_in" => "sessions#new", as: "log_in"

  resources :sites, except: [:new, :edit, :index, :show, :update, :destroy, :create]   do
  collection do
    get :home
    get :about_us
    get :faq
    get :discounts
    get :services
    get :contact_us
    get :admin
    get :posts
  end
end
resources :users
resources :abouts
resources :sessions
resources :coupons
resources :monthly_posts
resources :reviews
resources :categories do
collection { post :sort }
resources :children, :controller => :categories, :only => [:index, :new, :create,   :new_subcategory]
end
resources :products do
  member do
    put :move_up
    put :move_down
  end 
end
resources :faqs do
  collection { post :sort }
end 
root :to => 'sites#home'
match "/savesort" => 'sites#savesort'

end

match '', to: redirect("/#{I18n.default_locale}")
match '*path', to: redirect("/#{I18n.default_locale}/%{path}")

但截至目前,它重定向到/ 1个/ 1/1个/ 1/1个/ 1/1个/ 1/1个/ 1 /网站/管理(增加了一个直到浏览器抱怨)。

任何想法,为什么它不断添加/恩?

编辑:答案是伟大的,谢谢。 你能帮我诊断出根本途径?

root to: redirect("#{/#{I18n.default_locale}") # handles /

我知道重定向是寻找类似

redirect("www.example.com")

所以留下这部分

#{/#{I18n.default_locale}

该#{使用RUBYS串插,对不对? 我不知道那是什么{是尽管这样做。

然后我们有

/#{I18n.default_locale}

这也是使用字符串插值和打印出I18n.default_locale的价值?

希望这是有道理的,我真的很欣赏的帮助,我学习了很多东西。

编辑2:

我改了行从

root to: redirect("#{/#{I18n.default_locale}") # handles /

root to: redirect("/#{I18n.default_locale}") # handles /

但我不知道如果这就是正确的。 现在,我得到的错误

uninitialized constant LocaleController

我知道它越来越错误从根到:“区域#根”,但我认为在区域#将来自范围。

我会继续玩它,让你知道任何进展。

这里是一个新的链接到我的路线文件https://gist.github.com/2332198

Answer 1:

我们再次见面,ruevaughn。 :)

我创建了一个测试Rails应用程序和下面的小例子,对我的作品:

scope ":locale", locale: /#{I18n.available_locales.join("|")}/ do
  resources :sites do
    collection do
      get :admin
    end
  end

  root to: "locale#root" # handles /en/
  match "*path", to: "locale#not_found" # handles /en/fake/path/whatever
end

root to: redirect("/#{I18n.default_locale}") # handles /
match '*path', to: redirect("/#{I18n.default_locale}/%{path}") # handles /not-a-locale/anything


Answer 2:

当使用Rails 4.0.x的那个%{path}在重定向将逃生路径斜杠,所以你会得到一个无限循环重定向到/en/en%2Fen%2Fen%2Fen...

万一有人和我一样,正在寻找一个Rails-4适合的解决方案,这是我发现的是工作没有问题,甚至更复杂的路径被重定向:

# Redirect root to /:locale if needed
root to: redirect("/#{I18n.locale}", status: 301)

# Match missing locale paths to /:locale/path
# handling additional formats and/or get params
match '*path', to: (redirect(status: 307) do |params,request|
  sub_params = request.params.except :path
  if sub_params.size > 0
    format = sub_params[:format]
    sub_params.except! :format
    if format.present?
      "/#{I18n.locale}/#{params[:path]}.#{format}?#{sub_params.to_query}"
    else
      "/#{I18n.locale}/#{params[:path]}?#{sub_params.to_query}"
    end
  else
    "/#{I18n.locale}/#{params[:path]}"
  end
end), via: :all

# Redirect to custom root if all previous matches fail
match '', to: redirect("/#{I18n.locale}", status: 301), via: :all


文章来源: Why rails app is redirecting unexpectedly instead of matching the route?