для вызова метода класса в ruby на рельсах? - PullRequest
0 голосов
/ 16 марта 2020

Я установил класс в своей папке lib, назовем его файлом service.rb, который управляет обменом сообщениями с помощью стороннего API (пример ниже). этот класс служит интерфейсом между моим кодом и функциональностью, предоставляемыми сторонним API.

Я хочу иметь возможность показывать сообщения, отправленные / полученные в представлении / частичном представлении, чтобы я мог прикрепить его в любом другом представлении.

можно ли вызвать этот код из любого представления? или мне нужно создать представление / частичное представление специально для этого класса. также у меня нет контроллера или модельного класса для этого, что является соглашением в ruby на рельсах. Каков наилучший способ сделать это?

class Messaging
   include ThirdyPartyLibrary

   def send
   end

   def receive
   end
end

1 Ответ

2 голосов
/ 16 марта 2020

Это просто концептуально неправильно.

Представление вообще не должно вызывать службу, особенно если оно включает сторонний 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 %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...