【问题标题】:Rails / Using Single Table Inheritance with non-english type valuesRails / 使用具有非英语类型值的单表继承
【发布时间】:2014-07-04 06:25:22
【问题描述】:

我正在考虑为我的联系人模型使用单表继承,以便为不同类型的联系人实现不同的行为。据我了解,Rails 通过查看 contact.rb 中类型列的值来确定要使用的 model.rb、控制器、路由等。

我打算为联系人使用单个创建表单,用户可以在其中选择选择框中的联系人类型。但是,如果我的默认应用程序语言是德语,这将如何工作?因此,用户不会选择像“客户”这样的联系人类型,而是选择“Kunde”——当然,我不想弄乱我的文件名,而是想使用 customer.rb、customers_controller.rb、customer_path 等等。

虽然我知道您可以通过在表单的选择框中使用德语名称和英语值来隐藏这个问题,但只要我想在其他任何地方显示该值,这将是一个问题,它需要是德语.

如果您的应用不是英文的,我是否缺少某些东西或 STI 不值得努力?

【问题讨论】:

  • 我在非英语应用程序中从未遇到过性传播感染问题。我建议您保留英文代码,包括模型和字段名称,然后使用 I18n 框架翻译成德语。代码全是英文时更容易阅读,它使您能够充分利用 Rails 附带的约定。
  • 虽然一般来说这是一个很好的建议(使用 I18n),但它并不真正适用于这种情况。您不会将模板中的单词翻译成模板中的其他单词——这是 I18n 的一个很好的用例。这个问题在方程中有或没有德语都存在。
  • @Sharagoz 当然,出于您已经提到的原因,我打算将我的代码保留为英文。但是,我认为当使用非英语用户输入来定义模型结构/关系时,我提出的问题变得很重要,因为在这种情况下,类型列的值可能是非英语术语。现在我想知道如何告诉 Rails 一种“Kunde”属于客户模型。
  • 实际模型名称存储在 rails 用于跟踪 STI 的 type 列中。如果模型名称是英文,那么这些值也将是英文。
  • 您可以像翻译任何其他模型一样翻译 STI 模型的模型名称。如果你用 I18n 将“Customer”翻译成“Kunde”,那么调用Customer.model_name.human 将返回“Kunde”。我建议您尝试实施它,然后在实际遇到问题时提出有关 SO 的问题。这可能比您想象的要容易。

标签: ruby-on-rails activerecord ruby-on-rails-4 localization sti


【解决方案1】:

我似乎需要一些从select 中的项目到数据库中联系人种类(类型)的翻译层。我不建议允许用户从下拉列表中选择文字类名,而是有一个从选择值到类名的映射。这种映射可以存在于任何有意义的地方,但一种方法是将它放在控制器中

class ContactsController < ApplicationController
  before_filter :translate, only: :create

  def create
    @contact = @translated.create(params[:contact].permit(:name, :starting_date))

    respond_with @contact
  end

  def translate
    mapping = {'Kunde', => Customer, 'Besteller' => Purchaser}

    render_error unless (@translated = mapping[params[:type]]).present?
  end
end

这里我们支持昆德语到客户和畅销书到采购员两种可能的翻译,否则是错误的

【讨论】:

  • 我正在尝试遵循您的建议,但有几个问题:类型列中保存了哪个值?我假设是英语术语,而德语仅在选择框中使用,对吗?如果是这样,不是a)非常类似于为选择选项使用不同的名称/值属性的策略,b)我不需要在所有显示类型列的视图中处理某种形式的翻译/i18n吗?这似乎相当复杂,我更愿意将“Kunde”作为列中的实际值,但让 Rails 知道使用客户模型。抱歉,如果我误解了你 - 我是 Rails 新手。
  • 它不是英文术语也不是德文术语,而是项目的类名,在这种情况下为CustomerPurchaser。在内部,rails 将获取类型列中的值并在其上运行 constantize 方法并返回该类作为结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多