Как создать подмножество вложенных атрибутов с помощью Ruby on Rails 5.2 - PullRequest
0 голосов
/ 08 февраля 2019

Мое приложение - это база знаний, описывающая бизнес-правила на нескольких языках.Переводы имени и описания оформляются как вложенные атрибуты.Их нет в основной таблице, только в таблице переводов:

  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 ('language =?', User_language)

, отображается поле ввода,Но это не соответствует требованию редактирования, потому что также показаны все переводы.

Я подозреваю, что это выражение запрашивает вложенные атрибуты из базы данных, а не те, которые инициализируются методом new вконтроллер.

Есть ли способ избежать этого или отфильтровать : name_translations , переданный методу fields_for ?

Спасибо заваша помощь!

1 Ответ

0 голосов
/ 08 февраля 2019

Если я правильно понимаю, вам не нужно фильтровать действие : name_translations для new.Таким образом, в форме вы можете использовать persisted?, чтобы проверить, существует ли запись:

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

Благодаря этому вы можете фильтровать вложенные атрибуты только для существующих записей.

...