2015-08-05 4 views
2

Я использую globalize gem для перевода контента в мое приложение Rails. Все отлично работает, когда я меняю язык на языке по умолчанию: en to: de, но когда я хочу изменить язык: de: en я получаю NoMethodError (undefined method 'color' for nil:NilClass)nil класс при изменении языка от: de до: en, но не наоборот

Я провел некоторое исследование и попробовал несколько советов, но имею признать, что я не совсем понимаю этот бит, который, вероятно, является причиной ошибки:

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 
+0

Когда вы получаете «NoMethodError»? После некоторого запроса (какой)? Когда вы что-то делаете в консоли (что именно)? – EugZol

+0

Я получаю сообщение об ошибке при смене языка с: de до: en, нажав на ссылку: '<% = link_to" E ", locale:" en "%>' –

ответ

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.

+0

Спасибо большое! Вы очень помогли! –

+0

Добро пожаловать! Если вам нравится мой ответ, подумайте о том, чтобы выжить :) – EugZol