Необходимость выбирать между моими проверками / сообщениями об ошибках или упорядочением объектов по другому атрибуту - PullRequest
0 голосов
/ 14 сентября 2018

Я постараюсь объяснить это как можно лучше, и я потратил много времени, пытаясь убедиться, что это не дубликат, а извинения, если я что-то упустил.Проблема, с которой я столкнулся, довольно проста и касается количества аргументов, которые я могу передать simple_fields_for при работе с вложенными атрибутами с помощью кокона.Не добавляя вручную некоторый код для создания уведомления об ошибке, я ничего не получил от него, поэтому мне пришлось настроить код следующим образом:

Модель курса

class Course < ApplicationRecord
  has_many :learning_objectives, dependent: :destroy, inverse_of: :course
end

ОбучениеМодель цели

class LearningObjective < ApplicationRecord
  belongs_to :course, touch: true
  scope :sorted, -> { order(:sort) }
end

Форма, которая использует f.error_notification

= simple_form_for(@course) do |f|
  = f.error_notification
  .row
    .col-md-12 Learning Objectives
      = f.simple_fields_for :learning_objectives, f.error_notification do |objective|
        = render 'learning_objective_fields', f: objective
      = link_to_add_association 'Add Another Objective', f, :learning_objectives, class: 'btn btn-default btn-sm', data: { association_insertion_node: '.objectives', association_insertion_method: :append }

Частичные цели обучения

.nested-fields
  .table
    .row
      .col-md-8
        = f.input :name, label: false
      .col-md-2
        = f.input :sort
      .col-md-2.spaced-out
        =link_to_remove_association 'Remove Objective', f, class: 'btn btn-danger btn-xs'

И это прекрасно работает, чтобы получить необходимое уведомление о вложенномполе.Тем не менее, я ранее использовал f в simple_fields_for, как вы видите здесь:

Форма, которая использует f.object.learning_objectives.order(:sort)

= simple_form_for(@course) do |f|
  = f.error_notification
  .row
    .col-md-12 Learning Objectives
      = f.simple_fields_for :learning_objectives, f.object.learning_objectives.order(:sort) do |objective|
        = render 'learning_objective_fields', f: objective
      = link_to_add_association 'Add Another Objective', f, :learning_objectives, class: 'btn btn-default btn-sm', data: { association_insertion_node: '.objectives', association_insertion_method: :append }

И когда я удаляю эту сортировку, то она возвращается обратнок тому, как это было изначально сортировка, которая не была идеальной.Итак, проблема в том, что я могу использовать только один из аргументов за раз, и я не уверен, возможно ли иметь метод, с помощью которого мы можем использовать более одного аргумента для нашего объекта f вложенных атрибутов.

Возможно, есть способ сделать это просто, и я также сделаю кросс-пост для переполнения стека с тем же заголовком, чтобы посмотреть, есть ли у них предложения, если это слишком конкретно, чтобы поднять проблему здесь.Большое спасибо за любой совет или направление, которое вы могли бы предложить, и спасибо за великолепную жемчужину!

1 Ответ

0 голосов
/ 18 сентября 2018

Это странно.Если меня не смущает, вторым параметром для simple_fields_for может быть только массив вложенных элементов, и, если он не задан, он просто проверит отношение / ассоциацию.Поэтому я не понимаю, как будет работать передача f.error_notification (которая является визуальным представлением ошибок), если только fields_for просто пропускает ее, потому что это строка, а не перечисляемая.

Во-вторых: если вы вызываетеorder он попытается упорядочить с помощью sql, так что он действительно покажет только сохраненные элементы из базы данных.Если вы просто попытаетесь отсортировать массив, он будет работать так, как вы ожидаете.Например, что-то вроде

 f.object.learning_objectives.to_a.sort{|x,y| x.sort <=> y.sort}
...