使用全球化gem通过自动完成功能管理翻译,在某些情况下需要正确设置许多挂钩。注意:这不使用hstore AFAIK。我还没有找到一种方法。迄今为止最有效的设置是 控制器:
autocomplete :nation, :name, :full => true
国家
translates :name
视图
<%= autocomplete_field_tag 'nation_name', '', autocomplete_nation_name_itins_path, size: 35, :id_element => 'nation_id' %>
到目前为止,尚无对nation_translations
创建的Globalize
数据库表的固有引用。如下图所示,存在一个问题:
问题1:输入仍然绑定到基表的属性值(我还没有按照Globalize gem的建议清除它们。否则,我将得到空白)。 can
实际上已经准备好主表中can
的所有值...在其他语言环境中键入,例如西里尔语的Канада
自然没有任何作用,因为该值不属于Nation表。
有趣的是,Rails会自动填充下拉值,并提取输入内容的转换值。
问题2:我宁愿将参数'nation_id'与表单数据一起自然传递到country_translations表中。尽管我可以将, :extra_data => [:nation_id]
附加到控制器上,但它并未提交(例如西里尔字母的示例,其中输入没有任何自动完成功能)
{"utf8"=>"✓", "nation_name"=>"Канада", "commit"=>"..."}
Rails.logger.info :extra_data
返回:
extra_data
现在可以解决第二个问题,因为像这样的查询
Nation::Translation.where('name = ?', "Канада").pluck('nation_id')
返回正确的结果。但是,如果自动完成功能不符合用户输入的要求,那么这一点就没有意义了。
如何配置它以使用户输入自动完成当前本地翻译?
答案 0 :(得分:0)
这确实可以通过创建一个具有属性nation_id, name, locale
的全新类来解决,因此可以被象征性地调用。
查询调用不是那么简单。正如宝石所暗示的,该方法需要调整
def autocomplete_nation_name
term = params[:term].downcase
locale = params[:locale]
nationtranslations = Nationtranslation.where('locale = ? AND name LIKE ?', locale, "%#{term}%").order(:name).all
render :json => nationtranslations.map { |nationtranslation| {:id => nationtranslation.id, :label => nationtranslation.name, :value => nationetranslation.name} }
end
干预动作方法本身可以提供所需的所有余地...