Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.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 如何避免Globalize3将属性的回退翻译返回到特定上下文中?_Ruby On Rails_Internationalization_Fallback_Globalize3 - Fatal编程技术网

Ruby on rails 如何避免Globalize3将属性的回退翻译返回到特定上下文中?

Ruby on rails 如何避免Globalize3将属性的回退翻译返回到特定上下文中?,ruby-on-rails,internationalization,fallback,globalize3,Ruby On Rails,Internationalization,Fallback,Globalize3,我正在使用Globalize3和easy_globalize_accesors进行网站的国际化/本地化工作,现在我正在调整表单以管理可能翻译的字段。 假设我有一个名为Role的类: class Role translates :name, :fallbacks_for_empty_translations => true # rest of class definition 我之所以这样做,是因为我想在当前区域设置中没有翻译或翻译为空时显示默认翻译,并且该翻译按预期工作。 但

我正在使用Globalize3和easy_globalize_accesors进行网站的国际化/本地化工作,现在我正在调整表单以管理可能翻译的字段。 假设我有一个名为Role的类:

class Role  
  translates :name, :fallbacks_for_empty_translations => true
  # rest of class definition
我之所以这样做,是因为我想在当前区域设置中没有翻译或翻译为空时显示默认翻译,并且该翻译按预期工作。
但是,在我的表单中,我希望相反:我希望每个引用不同于默认语言环境的语言环境的输入都不显示任何值,除非role\u translations表中有该属性的值。以下是我创建输入的方式:

<%= textfield 'role', "name_#{locale}", :class => ... %> 
…%>
目前,如果我创建了一个新角色,其中只包含默认区域设置的翻译,那么当我想要编辑该角色以将翻译添加到其他区域设置时,每个输入都会显示默认翻译的值。
提前感谢

Globalize创建一个
def Globalize\u fallbacks(locale)
方法,该方法返回fallback locale。不幸的是,没有简单的方法来配置它,因此它不会返回回退

您可以做的是重新定义globalize_fallbacks方法,以返回您想要回退的任何区域设置。因为您实际上想要禁用回退,所以此方法

def globalize\u回退(区域设置)
[地区]
结束
因此,您可以在显示表单之前重新定义该方法,然后将其还原。大概是

<% Model.send :define_method, :globalize_fallbacks do  |locale|
  [locale] # You only want this locale to be used
end %>

<%= render_form %>

<% Model.send :define_method, :globalize_fallbacks do |locale|
  Globalize.fallbacks(locale) # This is globalize default behaviour
end %>


这感觉像是一种肮脏的黑客行为,但它是一种解决方案:)

您可以在您的模型中实现此方法:

  def read_translated_attribute(name)
    globalize.stash.contains?(Globalize.locale, name) ? globalize.stash.read(Globalize.locale, name) : translation_for(Globalize.locale).send(name)
  end
然后,您只需在表单中明确设置输入值,如下所示:

<%= text_field 'role', "name_#{locale}", :value => @role.read_translated_attribute(:name), :class => ... %>
@role.read\u translated\u属性(:name),:class=>…%>
您可以使用

<%= text_field 'role', "name_#{locale}", :value => @role.name_translations[locale], :class => ... %>
@role.name\u翻译[语言环境],:class=>…%>

在运行时定义\u方法
对全局方法缓存计数器不好。本质上,调用define_方法会导致必须重新查找每个方法,以查看应该在哪里定义它。表现不好!见: