Я не уверен, как лучше всего это сделать, или мое мышление в корне ошибочно.
У меня есть контроллер, который создает презентатор Plain Old Ruby Object (PORO) в своем действии #index
:
# app/controllers/my_controller.rb
class MyController < ApplicationController
def index
@my_presenter = MyPresenter.new(
filter_1: params[:filter_1],
filter_2: params[:filter_2])
end
end
И презентатор, который использует данные из нескольких моделей:
# app/presenters/my_presenter.rb
class MyPresenter
def initialize(filter_1: nil, filter_2: nil)
@my_data = MyModel.my_scope(filter_1) # scoping in the my_model.rb file
@my_other_data = MyOtherModel.my_scope(filter_1, filter_2)
end
def show(view)
# Somehow call the my_function.js from here and return the result to the view
end
end
И, наконец, представление, которое зависит от ведущего:
<!-- app/views/my_controller/index.html.erb -->
<h1>The view</h1>
<%= @my_presenter.show(this) %>
Я хочу, чтобы действие #show
ведущего вызывало некоторый JavaScript (код D3 для визуализации) и возвращало результат в представление:
// app/assests/javascripts.js
function my_function(data) {
// D3 visualisation to go here...
return null
}
Каков наилучший способ добиться этого?