应用控制器没有被执行在router.rb为默认的区域设置访问域时没有重定向(Application

2019-11-03 03:40发布

在我的Rails应用程序中使用的语言环境。 我有以下的routes.rb

scope ":locale", locale: /#{I18n.available_locales.join("|")}/ do
    root to: 'static_pages#home'
    devise_for :users, :controllers => { :registrations => :registrations }

    resources :blogs do
        resources :comments
    end

    get 'tags/:tag', to: 'blogs#index', as: :tag
    resources :users 
    get '/users/subregion_options' => 'users#subregion_options'

    resources "contacts", only: [:new, :create]
    match '/crew',    to: 'static_pages#crew',    via: 'get'

    ....
end



match '*path', to: redirect("/#{I18n.locale}/%{path}"), constraints: lambda { |req| !req.path.starts_with? "/#{I18n.default_locale}/" }, via: 'get' 

我想访问该页面的用户重定向到依赖于语言的浏览器设置(HTTP标头)的语言环境。 这一切工作 - 基本。 但是,访问本地主机:3000 / application_controller.rb不会被调用-therefore的set_locale没有被执行,这意味着用户与欢迎轨页结束

我怎么可以强制set_locale被称为?

class ApplicationController < ActionController::Base

    before_filter :set_locale

    def set_locale
      if params[:locale].blank?
        redirect_to "/#{extract_locale_from_accept_language_header}"
      else
        I18n.locale = params[:locale]
      end
    end


private
    def extract_locale_from_accept_language_header
        case request.env['HTTP_ACCEPT_LANGUAGE'].try(:scan, /^[a-z]{2}/).try(:first).try(:to_sym)
      when 'en'
        'en'
      when 'de'
        'de'
      when 'de-at'
        'de'
      when 'de-ch'
        'de'
      else
        'en'
      end

    end

    def default_url_options(options = {})
         {locale: I18n.locale}
   end

Answer 1:

我莫名其妙地解决了这个问题(不能完全肯定,如果这是最优雅的方式),通过创建一个重定向到触发设置的地点:

在我的routes.rb我添加了区域范围以外的下列内容:

root to: 'static_pages#redirect'

这里完整版

scope ":locale", locale: /#{I18n.available_locales.join("|")}/ do
match '',    to: 'static_pages#home', :as => 'home',    via: 'get''
devise_for :users, :controllers => { :registrations => :registrations }

resources :blogs do
    resources :comments
end

get 'tags/:tag', to: 'blogs#index', as: :tag
resources :users 
get '/users/subregion_options' => 'users#subregion_options'

resources "contacts", only: [:new, :create]
match '/crew',    to: 'static_pages#crew',    via: 'get'

....
end

我到现在都只有一个根。 我也改变了root_to到区域范围内匹配,使用:如=>回家,所以我可以参照它的link_to从意见home_path。

因此,当用户进入xxxx.com - 他/她将重定向其中执行以下操作结束:

class StaticPagesController < ApplicationController
  def redirect
    redirect_to home
  end

  def home
  end

由于该区域是空白的,现在会检查在HTTP头中的语言环境,如果首选语言的用户确实存在,他/她将获得引导到正确的页面/语言。 对于后续的请求(即:当用户点击一个链接)的区域将被从URL参数读出。

如果有一个更优雅的解决这个随意回答 - 点仍然待价而沽。



文章来源: Application Controller not being executed when accessing domain without redirect in router.rb to default locale