我有一个新的rails引擎,我想使用globalize3.我在我的lib // engine.rb中做了这个:
require 'globalize3'
module SimpleCms
class Engine < ::Rails::Engine
end
end
Run Code Online (Sandbox Code Playgroud)
现在,我尝试创建这样的迁移:
class CreatePages < ActiveRecord::Migration
def up
create_table :pages do |t|
t.string :path
t.timestamps
end
Page.create_translation_table! title: :string, body: :body
end
def down
drop_table :pages
Page.drop_translation_table!
end
end
Run Code Online (Sandbox Code Playgroud)
我有这个错误:
undefined method `create_translation_table!' for #<Class:0x00000001d5ca18>
Run Code Online (Sandbox Code Playgroud)
我认为没有加载文件'lib/globalize/active_record/migration.rb'.
有解决方案吗
过去几个小时我一直在摸不着头脑,寻找答案,但我找不到任何地方.
我的宝石文件:
# Use globalize for translating models
gem "globalize", github: "ncri/globalize" # for Rails 4.2
gem 'globalize-accessors', '~> 0.1.5'
# Use friendly_id for slugs
gem 'friendly_id', '~> 5.1.0'
gem 'friendly_id-globalize', '~> 1.0.0.alpha1'
Run Code Online (Sandbox Code Playgroud)
情况如下:
我有两种语言"en"和"fr"
2个模型:pages和pages_translations页面有一个slug列,pages_translations也有一个slug列.
如果我查看页面 - > en/pages/slug-en,它可以工作.
如果我查看页面 - > fr/pages-slug-fr,它可以工作.
所以我假设friendly_id和globalize已正确配置.
但是我的问题是我不能使用以下语言切换器:
<% if I18n.locale != :en %>
<li>
<%= link_to t('menu.languages.short_en'), url_for(locale: 'en') %>
</li>
<% end %>
Run Code Online (Sandbox Code Playgroud)
路线变为en/pages/slug-fr(即语言改变但不是slug).
我在初始化程序中激活了config.use:finders.
我的页面模型:
translates :title, :slug, :blurb, :content, :seo_title, :seo_description, :seo_keywords
globalize_accessors :locales => [:en, :fr], :attributes …Run Code Online (Sandbox Code Playgroud) ruby-on-rails friendly-id globalize3 globalize ruby-on-rails-4.2
我有小桌子:
create_table :cities do |t|
t.string :name
end
Run Code Online (Sandbox Code Playgroud)
我需要国际化"名称"列,我不想为此创建单独的表.是否可以将翻译列添加到"城市"表中?结果我希望这个表的迁移看起来像这样:
create_table :cities do |t|
t.string :en_name
t.string :de_name
t.string :fr_name
end
Run Code Online (Sandbox Code Playgroud)
目前我正在尝试使用"globalize"gem,也许我应该使用其他解决方案,请指教.
ruby-on-rails internationalization globalize3 rails-i18n globalize
当我试图通过指定的艺术家获取所有音频歌曲时,我收到错误:
ActiveRecord::StatementInvalid: PGError: ERROR: column reference "artist" is ambiguous
LINE 1: ... AND (audio_translations.artist IS NOT NULL) AND (artist = '...
^
: SELECT "audios"."id" AS t0_r0, "audios"."audio_genre_id" AS t0_r1, "audios"."song" AS t0_r2, "audios"."artist" AS t0_r3, "audios"."file_id" AS t0_r4, "audios"."photo_id" AS t0_r5, "audios"."description" AS t0_r6, "audios"."position" AS t0_r7, "audios"."created_at" AS t0_r8, "audios"."updated_at" AS t0_r9, "audios"."date" AS t0_r10, "audio_translations"."id" AS t1_r0, "audio_translations"."audio_id" AS t1_r1, "audio_translations"."locale" AS t1_r2, "audio_translations"."artist" AS t1_r3, "audio_translations"."song" AS t1_r4, "audio_translations"."description" AS t1_r5, "audio_translations"."created_at" AS t1_r6, "audio_translations"."updated_at" AS …Run Code Online (Sandbox Code Playgroud) 我想在Ruby on Rails上使用globalize3 gem时实现一个简单的搜索功能.由于模型的转换存储在单独的表中,因此下面的代码不起作用,因为products表中不再有:name字段.如何调整下面的代码以使搜索功能正常?
products_controller.rb
@products = Product.search(params[:search]).all
Run Code Online (Sandbox Code Playgroud)
index.html.erb
<%= form_tag products_path, method: :get do %>
<%= text_field_tag :search, params[:search] %>
<%= submit_tag "Search", name: nil %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
模型
class Product < ActiveRecord::Base
translates :name
attr_accessible :name, :price, :released_at
def self.search(search)
if search
where('name LIKE ?', "%#{search}%")
else
scoped
end
end
end
Run Code Online (Sandbox Code Playgroud) 我有一个使用Globalize3 0.3.0的Rails 3.2.7项目
看起来,如果你为一个具有用Globalize3翻译的属性的模型制作一个fixture,那么fixture会在数据库中填充模型的表,而不是使用的转换表通过Globalize3.
因此,如果在单元测试中使用模型,则找不到已翻译属性的值.如果此属性具有在线状态验证规则,则会使模型无效.
我有一个解决方法,包括使用单元测试的全局设置,明确设置夹具模型的翻译属性.但这不是一个好的解决方案.
有什么方法可以解决这个问题吗?
我在我的Rails 3.2.14应用程序中使用了friendly_id(4.10.1)和globalize(3.0.0):
# globalize3
translates :title, :slug
# friendly_id
extend FriendlyId
friendly_id :title, use: [:slugged, :globalize]
Run Code Online (Sandbox Code Playgroud)
当我保存输入时,friendly_id检查slug碰撞:
SELECT "pages".* FROM "pages" WHERE
("slug" = 'my-title' OR "slug" LIKE 'my-title--%') AND (id <> 1)
ORDER BY LENGTH("slug") DESC, "slug" DESC LIMIT 1
Run Code Online (Sandbox Code Playgroud)
Friendly_id应该使用转换表page_translations,因为pages当您使用多个语言环境时,原始表中的条目有点随机.
这就是问题所在:friendly_id只识别一种语言/语言环境的slug冲突.
有没有人知道如何更改完整全球化支持的查询?非常感谢你提前!
我正在使用Globalize3和easy_globalize_accesors进行网站的国际化/本地化工作,现在我正在调整表单以管理具有可能翻译的字段.假设我有一个名为Role的类:
class Role
translates :name, :fallbacks_for_empty_translations => true
# rest of class definition
Run Code Online (Sandbox Code Playgroud)
我这样做是因为我想显示默认翻译,如果没有翻译或在当前语言环境中为空,这可以按预期工作.
但是,在我的形式中,我想要相反:我希望每个输入引用不同的语言环境而不是默认语言环境,以显示没有值,除非在role_translations表中有该属性的值.这是我创建输入的方式:
<%= textfield 'role', "name_#{locale}", :class => ... %>
Run Code Online (Sandbox Code Playgroud)
目前,我发生的情况是,如果我创建了一个只有默认语言环境翻译的新角色,当我想编辑角色以将翻译添加到其他语言环境时,每个输入都会显示默认翻译的值.
提前致谢
我有令人敬畏的Globalize3宝石的麻烦.现在我有两种语言:en和:ru.并且:ru回归:恩喜欢这个
#/config/initializers/globalize.rb
Globalize.fallbacks = {:ru => [:ru, :en]}
Run Code Online (Sandbox Code Playgroud)
在我的控制器中,我试图通过名称翻译或翻译后备值对翻译记录的整个集合进行排序.但with_translations()似乎没有给我这样的机会!
Country.with_translations(:ru).order('country_translations.name ASC')
#this filters out those who have no :ru translations (BUT THEY SHOLD USE FALLBACKS!)
Run Code Online (Sandbox Code Playgroud)
所以要检索我可以传递一系列语言环境的所有记录:
Country.with_translations([:ru, :en]).order('country_translations.name ASC')
#but this completely ruins the sorting order (DAMN NOTHING IS SORTED)
Run Code Online (Sandbox Code Playgroud)
我想要的唯一简单的事情就是获得后备并整理所有东西!所以我们需要以某种方式获取所有记录,只按可用的名称值排序.
有什么办法吗?
在 Rails 中,我们可以使用obj.field_changed?.
假设我有一个使用Globalize3.
它有 translates :name
如何检查 name 属性是否已更改?
就像是 obj.name_changed?
globalize3 ×10
activerecord ×2
fallback ×2
friendly-id ×2
globalize ×2
fixtures ×1
postgresql ×1
rails-i18n ×1
search ×1