我的应用程序是描述在几种语言的业务规则的知识库。名称和描述的翻译被设计为嵌套属性。它们并不存在于主表,只有在翻译表:
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方法?
谢谢您的帮助!
如果我理解正确的话,你不需要过滤:name_translations为new
行动。所以,形式可以使用persisted?
检查是否存在记录:
<%= f.fields_for :name_translations, @business_rule.name_translations.where('language=?', user_language) if @business_rule.persisted? do |naming| %>
...
<% end %>
由于这一点,您可以只对存在的记录过滤嵌套的属性。