Чтобы обеспечить разделение проблем и предотвратить грязные взломы представлений большого проекта, я хотел бы ввести данные в представления (например, через контроллер), и тогда представление не могло бы получить доступ к моделям или любым другим объектам. класс проекта (только внедренная структура данных).
Как с помощью Rails предотвратить доступ встроенного кода Ruby в представления к другим частям проекта?
Но как вам удается создать эту изоляцию @jvillian? Внедрить объект Presenter в представление просто, как пирог, но я не понимаю, как можно запретить представлению доступ к чему-либо.
Ооооо. Вы хотите знать как? Вы должны были спросить что вместо Является ли это возможным?! Постой, я отправлю ответ.





ОК. Вот и все. (Это неполный код и предназначен для указания направления, я многое удалил, поэтому вам придется заполнить пробелы.)
Сначала я создаю модуль под названием ActsAs::Rendering. Это предоставляет экземпляр ActionView::Base, который является ключом к рендерингу в любом месте.
module ActsAs::Rendering
private
def action_view() @action_view ||= new_action_view end
def new_action_view
av = ActionView::Base.new
av.view_paths = ActionController::Base.view_paths
av.class_eval do
include Rails.application.routes.url_helpers
include ApplicationHelper
end
av
end
def method_missing(meth, *params, &block)
if action_view.respond_to?(meth)
action_view.send(meth, *params, &block)
else
super
end
end
def render_partial(file_ref)
render(partial: "#{file_ref}", locals: {presenter: self})
end
end
Затем я создаю PresenterBase, который включает ActsAs::Rendering:
def PresenterBase
include ActsAs::Rendering
class << self
def present(args = {})
new(args).present
end
end # Class Methods
#==============================================================================================
# Instance Methods
#==============================================================================================
def initialize(args)
@args = args
end
private
end
А теперь я создаю класс Presenter, реализующий present.
def FooPresenter < PresenterBase
#==============================================================================================
# Instance Methods
#==============================================================================================
def present
render_partial 'path/to/foo/partial'
# or do a lot of other cool stuff.
end
end
И все мои взгляды начинаются с:
- @presenter = local_assigns[:presenter] if local_assigns[:presenter]
И теперь у представления больше нет доступа ни к чему, кроме своего ведущего.
* ПРИМЕЧАНИЕ *
Есть еще кое-что, но мне нужно выбежать. Я обновлю позже.
Да, это возможно. В моих проектах представления никогда не имеют доступа к моделям. Или любой другой
Classв проекте, кроме единственного экземпляра классаPresenter.