0
votes

In my application controller, I am forcing locale handling as a before filter:

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

However, if I tried to visit http://localhost:3000/ko/lab it would result into routing error which is error 404 eventually.

Any locale out of the following locates will result into routing error: enter image description here

Any advice?

EDIT

My route.er:

# -*- 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

My server log:

Started GET "/ko/lab" for 127.0.0.1 at 2017-09-12 08:58:56 +0300 Processing by ApplicationController#routing_error as HTML
Parameters: {"path"=>"ko/lab"} User Load (202.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 12899]] Completed 404 Not Found in 205ms ko/lab excluded from capture: DSN not set

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

1
Can you include the logs which show the routing error and your routes.rb file?max

1 Answers

0
votes

Default local does work but you don't have a route that matches /:locale/lab. Its that simple.

You can create localized routes by using scope - Rails does not do this for you.

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

This is probably a good time to refactor a really messy routes file by using the resources helper to its full extent:

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

See http://guides.rubyonrails.org/routing.html#adding-more-restful-actions