Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails产品:区域设置切换_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails Rails产品:区域设置切换

Ruby on rails Rails产品:区域设置切换,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,在我的应用程序中,我使用会话切换了区域设置。逻辑保持在控制器中: class SetLanguageController < ApplicationController def russian I18n.locale = :ru set_session_and_redirect end def english I18n.locale = :en set_session_and_redirect end private def

在我的应用程序中,我使用会话切换了区域设置。逻辑保持在控制器中:

class SetLanguageController < ApplicationController

  def russian
    I18n.locale = :ru
    set_session_and_redirect
  end

  def english
    I18n.locale = :en
    set_session_and_redirect
  end

  private

  def set_session_and_redirect
    session[:locale] = I18n.locale
    redirect_to :back
    rescue ActionController::RedirectBackError
      redirect_to :root
  end

end
路由中的区域设置代码不需要提问,但如果您感兴趣

get 'rus_locale' => 'set_language#russian'
get 'eng_locale' => 'set_language#english'
它在开发过程中工作得很好,但在生产过程中工作得很好

application.rb

config.i18n.load_path += Dir[Rails.root.join('config','locales', '*.yml').to_s]
config.i18n.default_locale = :ru

我怎样才能使它在生产中发挥作用?谢谢

我解决了在应用程序控制器中设置before\u过滤器的问题,如

  before_filter :set_locale

  def set_locale
    I18n.locale = session[:locale] ? session[:locale] : I18n.default_locale
  end
但这个解决方案是假的,因为它实际上并没有解决问题的本质——以前的代码是在开发中工作的,而是在生产中工作的。如果您知道如何更灵活地修复它,您将成为wellcome

强健的I18n实现:

添加locales.rb初始值设定项以定义您支持的I18n.available\u语言环境:

config/initializers/locales.rb 允许应用程序使用的区域设置 I18n.available_locales=[:en,:fr] 在每种语言的语言环境文件中设置语言名称值,例如fr.yml:

fr: 语言名称:法语 当您添加更多语言时,此ERB将允许您在它们之间切换:

  // app/views/layouts/_languages.html.erb
  <span class="languages">
   <% I18n.available_locales.each do |locale| %>
      <% if I18n.locale == locale %>
        <%= link_to I18n.t('language_name', locale: locale), url_for( params.clone.permit!.merge(locale: locale, only_path: true ), {style: "display:none" } %>
      <% else %>
        <%= link_to I18n.t('language_name', locale: locale), url_for( params.clone.permit!.merge(locale: locale, only_path: true ) %>
      <% end %>
    <% end %>
  </span>

您是否在生产中使用任何类型的缓存?如果是这样,缓存键是否包含区域设置?@PeterGoldstein恐怕我不太明白你的意思。我使用默认的rails会话方法。如果我没有回答你的问题,你能解释一下吗。仅限生产的问题的一个典型来源是缓存,因为它通常在开发中被禁用。所以这是个好地方。由于您的内容将依赖于区域设置,因此如果您正在缓存,则区域设置将需要位于cache_键中。在生产环境中,什么不起作用?这不是在切换区域设置吗?我的问题应该更清楚一点。有什么错误吗?你怎么知道它没有切换?有没有像Peter Goldstein所说的那样涉及缓存?
  // app/views/layouts/_languages.html.erb
  <span class="languages">
   <% I18n.available_locales.each do |locale| %>
      <% if I18n.locale == locale %>
        <%= link_to I18n.t('language_name', locale: locale), url_for( params.clone.permit!.merge(locale: locale, only_path: true ), {style: "display:none" } %>
      <% else %>
        <%= link_to I18n.t('language_name', locale: locale), url_for( params.clone.permit!.merge(locale: locale, only_path: true ) %>
      <% end %>
    <% end %>
  </span>