Это просто концептуально неправильно.
Представление вообще не должно вызывать службу, особенно если оно включает сторонний API. В Rails ваши представления просто берут данные из контроллера и используют их для визуализации HTML. Задача контроллеров - вызывать службу и передавать данные в представление.
Почему? Потому что представления представляют собой смесь HTML и Ruby и должны быть максимально простыми. А выполнение вызовов API или БД в ваших представлениях может привести к серьезным проблемам с производительностью, поскольку сложно получить представление о том, где и когда они вызываются.
Используйте проблему, если хотите поделиться кодом для извлечения сообщений. в контроллере:
# app/controllers/concerns/messaging/controller_integration.rb
module Messaging
module ControllerIntegration
extend ActiveSupport::Concern
included do
before_action :fetch_messages
end
def fetch_messages
@messages = MessageService.call #
end
end
end
class FoosController < ApplicationController
include Messaging::ControllerIntegration
# ...
end
class BarsController < ApplicationController
include Messaging::ControllerIntegration
# ...
end
Используйте частичное, чтобы поделиться кодом вида для отображения сообщений. Не для того, чтобы на самом деле получить их!
# app/views/messages/_partial_name.html.erb
<%= messages.each do |m| %>
# ...
<% end %>
# app/views/foos/show.html.erb
<%= render partial: 'messages/partial_name', messages: @messages %>
# app/views/bars/show.html.erb
<%= render partial: 'messages/partial_name', messages: @messages %>