为什么默认语言环境不起作用?

时间:2017-09-12 05:44:02

标签: ruby-on-rails

在我的应用程序控制器中,我强制将语言环境处理作为前置过滤器:

before_filter :set_locale

def set_locale
  #I18n.default_locale is en
  I18n.locale = extract_locale_from_tld || I18n.default_locale
end

def extract_locale_from_tld
  parsed_locale = params[:locale] || ((lang = request.env['HTTP_ACCEPT_LANGUAGE']) && lang[/^[a-z]{2}/])
  #so, english is the default language.
  parsed_locale= 'en' if parsed_locale.nil?
  I18n.available_locales.include?(parsed_locale.to_sym) ? parsed_locale  : nil
end

但是,如果我尝试访问http://localhost:3000/ko/lab,则会导致路由错误,最终会导致错误404

以下定位中的任何区域设置都将导致路由错误: enter image description here

有什么建议吗?

修改

我的路线:

# -*- encoding : utf-8 -*-
MyApp::Application.routes.draw do

  mount Alchemy::Engine => 'blog'

  Rails.application.routes.draw do
    filter :pagination, :uuid, :locale
  end

  devise_for :users, :controllers => { :omniauth_callbacks => "callbacks",
                                       :sessions => "users/sessions",
                                       :registrations => "users/registrations"}



  resources :authentications


  resources :experiments
  get 'experiments/:id/info_edit' => 'experiments#info_edit',:constraints => { :id => /\d+/ }

  get 'sitemap.xml', :to => 'sitemap#index', :defaults => {:format => 'xml'}



  match 'lang' => 'home#set_lang', :via => [:get]

  #match 'free_trial' => 'home#free_trial', :via => [:get]
  match 'useful_links' => 'home#useful_links', :via => [:get]
  match 'home' => 'home#home', :via => [:get]


  match 'contact-us' => 'contact#new', :as => 'contact_us', :via => :get
  match 'contact' => 'contact#create', :as => 'contact', :via => :post

  match 'dashboard' => 'experiments#index', :via => [:get]
  post 'notifications' => 'subscriptions#instant_payment_notification'


  match 'users_experiments' => 'experiments#users_experiments', :via => [:get]
  match 'hire_us' => 'home#hire_us', :via => [:get]


  get 'lab' => 'experiments#lab'

  get 'experiments/:id/review-edit' => 'experiments#review', :as => :review
  get 'experiments/:id/cancel-edit' => 'experiments#cancel_edit', :as => :cancel_edit

  get 'experiments/:id/approve-edit' => 'experiments#approve', :as => :approve
  get 'experiments/:id/reject-edit' => 'experiments#reject', :as => :reject


  get 'experiments/:id/profile' => 'experiments#profile', :as => :profile



  match 'amazon' => 'experiments#amazon', :via => [:get]


  match 'trial_account' => 'home#trial_account', :via => [:get]
  match 'student_account' => 'home#student_account', :via => [:get]
  match 'school_account' => 'home#school_account', :via => [:get]



  match 'create_account' => 'home#registration_redirect', :via => [:get]
  match 'users/create_account' => 'home#registration_entrance', :via => [:get]
  match 'registration_redirect' => 'home#registration_redirect', :via=>[:post]
  # You can have the root of your site routed with "root"
  # just remember to delete public/index.html.
  root :to => 'home#home'

  get "/auth/oauth2/callback" => "auth0#callback"
  get "/auth/verification_complete" => "auth0#verification_complete"
  get "/auth/failure" => "auth0#failure"



end

我的服务器日志:

  

开始GET" / ko / lab"对于127.0.0.1在2017-09-12 08:58:56 +0300   由ApplicationController#routing_error处理为HTML
  参数:{"路径" =>" ko / lab"}用户负载(202.1ms)SELECT   "用户"。* FROM"用户"用户"。" id" = $ 1 ORDER BY"用户"。" id"   ASC LIMIT 1 [[" id",12899]]完成404在205ms ko / lab中找不到   从捕获中排除:未设置DSN

     

ActionController :: RoutingError(ko / lab):
  app / controllers / application_controller.rb:35:routing_error'
lib/rack/seoredirect.rb:20:in
来电'

1 个答案:

答案 0 :(得分:0)

默认本地确实有效,但您没有匹配/:locale/lab的路线。就这么简单。

您可以使用scope创建本地化路由 - Rails不会为您执行此操作。

scope '(:locale)', locale: /#{I18n.available_locales.join('|')}/ do
  get '/' => 'home#home' # this will map /en to home#home
  get 'lab' => 'experiments#lab'
  # ...
end

这可能是通过充分利用资源助手重构一个非常混乱的路由文件的好时机:

resources :experiments do
  member do
    get :info_edit
    # ...
  end
end

请参阅http://guides.rubyonrails.org/routing.html#adding-more-restful-actions