如何创建嵌套的属性与Ruby on Rails的5.2的一个子集

问题描述 投票:0回答:1

我的应用程序是描述在几种语言的业务规则的知识库。名称和描述的翻译被设计为嵌套属性。它们并不存在于主表,只有在翻译表:

  id            :integer          not null, primary key
  field_name    :string(30)       not null
  language      :string(2)        not null
  translation   :text
  created_at    :datetime         not null
  updated_at    :datetime         not null

业务规则可以有很多译文,在模型中声明:

  has_many :name_translations, -> { where("field_name='name'") }, class_name: 'Translation'
  has_many :description_translations, -> { where("field_name='description'") }, class_name: 'Translation'

在创作,我在初始化业务规则控制这些译文:

  def new
    @business_rule = BusinessRule.new
    @business_rule.name_translations.build(language: user_language, field_name: 'name')
    @business_rule.name_translations.build(language: user_language, field_name: 'description')
  end

在_form.html.rb,我想只显示翻译当前用户的语言。当然,在规则的创建,只有一种语言的版本,但我用同样的形式更新,我需要过滤嵌套的翻译,只保留当前用户的语言:

  <div class="row">
    <div class="col-md-1 text-right"> <%= t('Name')%>:
    </div>
    <%= f.fields_for :name_translations, @business_rule.name_translations.where('language=?', user_language) do |naming| %>
      <div class="col-md-8">
        <%= naming.text_field :translation, :class => "col-md-10" %>
      </div>
      <div class="col-md-1">
        <%= naming.hidden_field :field_name, :value => 'name' %>
      </div>
      <div class="col-md-1">
        <%= naming.hidden_field :language, :value => user_language %>
      </div>
    <% end %>
  </div>

这工作正常编辑现有的业务规则。但对于业务规则的创建,嵌套场不显示。

如果我删除

@ business_rule.name_translations.where( '语言=?',USER_LANGUAGE)

表达时,显示输入栏。但是,由于所有的翻译显示,以及这种不符合编辑要求。

我怀疑这个表达式查询从数据库中嵌套的属性,而不是在控制器的新方法初始化的人。

是否有办法避免这种情况,或者过滤:name_translations传递给fields_for方法?

谢谢您的帮助!

ruby-on-rails nested-forms
1个回答
0
投票

如果我理解正确的话,你不需要过滤:name_translations为new行动。所以,形式可以使用persisted?检查是否存在记录:

<%= f.fields_for :name_translations, @business_rule.name_translations.where('language=?', user_language) if @business_rule.persisted? do |naming| %>
...
<% end %>

由于这一点,您可以只对存在的记录过滤嵌套的属性。

© www.soinside.com 2019 - 2024. All rights reserved.