Rails 6 — Вызов неправильного помощника

#ruby-on-rails #ruby-on-rails-6

#ruby-on-rails #ruby-on-rails-6

Вопрос:

Сегодня мое приложение начало вызывать помощника с неправильным именем.

При загрузке представлений для Drills Exercise модели вызывается помощник модели. Это начало происходить сегодня, ничего не меняя.

Например, когда я загружаю представление для Drills :

   Rendering drills/show.html.erb within layouts/application
  Rendered drills/show.html.erb within layouts/application (Duration: 3.5ms | Allocations: 1551)
Completed 500 Internal Server Error in 63ms (ActiveRecord: 2.8ms | Allocations: 6965)


  
ActionView::Template::Error (undefined method `created_at' for nil:NilClass):
    3:     <div class="flex justify-between items-center mb-4">
    4:       <h1 class="h3"><%= link_to 'Drills', drills_path %> > Drill on <%= @drill.date_held.strftime('%d/%b/%y') %></h1>
    5:       <%= link_to 'Download PDF', drill_path(@drill, :pdf), class: "btn btn-link" %>
    6:       <% if can_edit? %><%= link_to 'Edit', edit_drill_path(@drill), class: "btn btn-link" %><% end %>
    7:       <% if can_destroy? %><%= link_to 'Delete', drill_path, class: "btn btn-danger outline", method: :delete, data: { remote: true, confirm: "Are you sure?" } %> <% end%>
    8:     </div>
    9: 
  
app/helpers/exercises_helper.rb:6:in `can_edit?'
app/views/drills/show.html.erb:6
  

Вызывается неправильный контроллер? Как это исправить?

Ответ №1:

Ознакомьтесь с документацией о помощниках Rails: https://api.rubyonrails.org/classes/ActionController/Helpers.html

В дополнение к использованию стандартных шаблонов-помощников, настоятельно рекомендуется создавать пользовательские помощники для извлечения сложной логики или повторно используемой функциональности. По умолчанию каждый контроллер будет включать все помощники. Эти помощники доступны только на контроллере через #helpers

Похоже, у вас уже есть метод, вызываемый can_edit? в вашем exercises_helper.rb .

Если вы хотите Drill , чтобы помощники были только в Drill контроллере / представлениях, вам нужно будет следовать этому:

Чтобы вернуть старое поведение, установите для config.action_controller.include_all_helpers значение false .