2

私はglobalize gemを使用して、Rails アプリのコンテンツを翻訳しています。言語をデフォルトの言語 :en から :de に変更するとすべて正常に動作しますが、言語を :de から :en に変更すると、NoMethodError (undefined method 'color' for nil:NilClass)

私はいくつかの調査を行い、いくつかのアプローチを試みましたが、おそらくエラーの理由であるこのビットを完全には理解していないことを認めなければなりません:

application_controller.rb

def set_locale
  I18n.locale = params[:locale] || I18n.default_locale
  request.subdomain
  request.env["HTTP_ACCEPT_LANGUAGE"]
  request.remote_ip
end

def default_url_options(options = {})
  (I18n.locale.to_sym.eql?(I18n.default_locale.to_sym) ? {} : {locale: I18n.locale})
end  

問題を解決する方法のヒントや、このコードがどのように機能するかについての説明をいただければ幸いです。

モデルは次のとおりです。

page.rb

class Page < ActiveRecord::Base

translates :name, :permalink

validates_uniqueness_of :permalink, :message => "This url is already taken"
validates_presence_of :permalink
validates_presence_of :name
validates_format_of   :permalink, :with => /\A[a-zA-Z0-9-_]*\z/i, :message => 'Url can only contain downcase letters from a-z and numbers from 0-9 and a dash and underscore'

before_save :only_allow_one_home_page

belongs_to :label
has_many :chapters
accepts_nested_attributes_for :chapters, :allow_destroy => true

mount_uploader :backgroundimage, BackgroundimageUploader

def chapters_for_form
 collection = chapters.where(page_id: id)
 collection.any? ? collection : chapters.build
end

def to_param
  permalink
end

end

コントローラ: pages_controller.rb

def set_page
  @page = Page.find_by_permalink(params[:id])
end

そしてルート:

resources :labels, do
  resources :pages
end
4

1 に答える 1

1

link_to以下を変更してみてください。

<%= link_to 'E', params.merge(locale: "en") %>

少し説明:

# You must have `before_action :set_locale` somewhere in your controllers
# So, this method is called before your controller code does its job
def set_locale
  # This just sets current locale to params[:locale]
  # So when you request URL like http://example.org/controller/action?locale=de,
  # params[:locale] contains 'de'
  I18n.locale = params[:locale] || I18n.default_locale
end

# default_url_options is function which, well, adds default options
# to every call of url_for helper method
# It is also called internally when you build paths and urls for
# resources, like 'labels_path' or 'pages_url'
def default_url_options(options = {})
  # This line just says to add 'locale=...' parameter (locale: I18n.locale) to the request,
  # unless default locale is selected
  # This will preserve your locale between requests
  (I18n.locale.to_sym.eql?(I18n.default_locale.to_sym) ? {} : {locale: I18n.locale})
end

さて、エラーに戻ります。URL パラメーターを link_to ヘルパーに提供する必要があります。「ロケール」のみを指定しますが、リンクが指すページを何らかの方法で決定する必要があります。追加することで、現在のパラメーターを使用するように指示し (そのため、現在のページにリンクします)、パラメーターをparams.merge(locale: en)追加するだけです。locale

于 2015-08-06T10:13:10.633 に答える