Как использовать оператор if перед перенаправлением на ссылку в Rails - PullRequest
0 голосов
/ 30 марта 2020

Я определил это в модели с именем analysis_result.rb:

  def total_matches
    return 0 unless self.patterns
    self.patterns.sum do |_, v|
      matches = v.matches.try(:count) || 0
      if v.additional.present? && v.additional['ggroup'].present?
        bc_matches = v.additional['ggroup'].try(:count) || 0
      else
        bc_matches = 0
      end

      matches + bc_matches
    end
  end

Я пытаюсь использовать его в представлении с именем _rable_row.haml, чтобы заранее проверить, равен ли total_matches 0 или не. Если это 0, я хочу отобразить частичное вместо того, чтобы позволить пользователю go перейти по ссылке.

Это код из вида для проверки if analysis.results.total_matches != 0:

%tr.form-table__row{ class: ('form-table__row--disabled' if analysis.processing?) }
  %td.form-table__data= check_box_tag "checkbox_object_ids[]", analysis.id

  %td.form-table__data
    - if analysis.results.total_matches == 0
      = render partial: 'partials/shared/empty'
    - elsif analysis.results.total_matches != 0
      = link_to analysis.title, analysis, class: 'js-toggle', data: { href: "loading-#{analysis.id}" }

    - unless analysis.viewed
      %span.dashboard__icon.dashboard__icon--small.fa.fa-circle.text-info{ aria: { hidden: 'true' }, title: 'New' }

Я получаю undefined method 'total_matches' for #<Mongoid::Criteria:0x00007fc51c5e3720>

Ответы [ 3 ]

1 голос
/ 30 марта 2020

Ваша проблема исходит из определения самого метода. Вы объявили свой метод total_matches на analysis_result.rb, но вы звоните analysis.results.total_matches. Я бы написал analysis.total_matches.

Бонус:

Я бы предложил охранную оговорку поверх вашего метода total_matches

def total_matches
  return 0 unless self.patterns
  # ...
end
0 голосов
/ 12 апреля 2020

Я решил проблему по-другому:

- if analysis.results.sum(&:total_matches) != 0

изменилось только на это.

0 голосов
/ 30 марта 2020

Из того, что я увидел в вашем обновленном вопросе, ваш AnalysisResult принадлежит Analysis. и total_matches - это метод экземпляра Analysis.

Но вы называете это как analysis.results.total_matches здесь, analysis.results предоставит вам массив активных записей в качестве результатов анализа has_many, поверх которого вы пытаетесь вызвать total_matches.

Вы должны попробовать analysis.results.find один экземпляр и вызвать total_matches поверх него.

Например: analysis.results.last.total_matches (я просто беру .last, например)

...