获得全球化和自动完成功能,一起工作

时间:2019-05-08 14:36:13

标签: ruby-on-rails autocomplete rails-i18n globalize

使用全球化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数据库表的固有引用。如下图所示,存在一个问题:

enter image description here

问题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')

返回正确的结果。但是,如果自动完成功能不符合用户输入的要求,那么这一点就没有意义了。

如何配置它以使用户输入自动完成当前本地翻译?

1 个答案:

答案 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

干预动作方法本身可以提供所需的所有余地...