nil class 将语言从 :de 更改为 :en 但反之则不然
nil class when changing the language from :de to :en but not the other way round
我使用 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
尝试更改您的 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
现在,回到错误。您必须向 link_to 助手提供 URL 参数。您只提供 'locale',但它应该以某种方式确定您希望 link 指向哪个页面。通过添加 params.merge(locale: en)
我们指示它使用当前参数(因此它将 link 到当前页面),仅向其另外添加 locale
参数。
我使用 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
尝试更改您的 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
现在,回到错误。您必须向 link_to 助手提供 URL 参数。您只提供 'locale',但它应该以某种方式确定您希望 link 指向哪个页面。通过添加 params.merge(locale: en)
我们指示它使用当前参数(因此它将 link 到当前页面),仅向其另外添加 locale
参数。