【问题标题】:Deleting a single translation from a model in a Rails project using Mobility使用 Mobility 从 Rails 项目中的模型中删除单个翻译
【发布时间】:2018-02-15 19:38:55
【问题描述】:

我正在将一个 Rails 项目从 Globalize 迁移到 Mobility。使用 Globalize,我可以通过 translation 方法访问当前翻译:

feature.translation

我主要在为模型管理翻译以删除特定翻译时使用它:

feature.translation.destroy

使用 Globalize,对于每个对象,我都会获得翻译列表并为每个对象创建一个删除按钮:

<%= link_to 'x', admin_feature_path(list_item, translation_locale: l), method: :delete, data: { confirm: %(Are you sure you want to delete this #{humanize_locale l} translation? This cannot be undone.) } %>

我使用通过链接传入的语言环境来删除相应的翻译:

Mobility.with_locale(translation_locale) do
  @feature.tranlsation.destroy
end

是否有一种直接的方法可以从具有多个翻译的模型中删除单个翻译?

【问题讨论】:

  • 为什么不直接更新db中的hstore/json字段?

标签: ruby-on-rails ruby-on-rails-5 mobility


【解决方案1】:

Mobility 在这里并没有什么特别之处。你有一个模型与translations 关联,每个translation 都有一个locale

所以要销毁翻译,你可以找到并销毁它:

translation = feature.translations.find { |t| t.locale == Mobility.locale.to_s }
translation.destroy

如果您想要像 Globalize 这样的方法,只需将其添加到您的模型中:

def translation
  translations.find { |t| t.locale == Mobility.locale.to_s }
end

就是这样!

【讨论】:

  • translations.find { |t| t.locale == Mobility.locale } 返回nil。由于translations 返回一个DownloadType::Translation::ActiveRecord_Associations_CollectionProxy 对象,它看起来像这样工作:translations.where(locale: Mobility.locale).first
  • 啊抱歉,那里缺少to_s,现在已修复(应该是Mobility.locale.to_s)。你不应该使用where,因为除非所有翻译都被持久化,否则它不会起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多