为了强制分离关注点并防止大项目视图中的脏黑客,我想在视图中注入数据(例如通过控制器),然后视图将无法访问模型或项目的任何类别(仅注入的数据结构)。
使用Rails,我们如何防止视图中的嵌入式Ruby代码访问项目的其他部分?
答案 0 :(得分:1)
确定。这是它的坚果。 (这是不完整的代码,用于表示方向,我已经删除了很多,因此您必须填写空白。)
首先,我创建了一个名为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
的{{1}}类。
present
我的观点都始于:
def FooPresenter < PresenterBase
#==============================================================================================
# Instance Methods
#==============================================================================================
def present
render_partial 'path/to/foo/partial'
# or do a lot of other cool stuff.
end
end
现在,该视图不再能够访问除演示者之外的任何内容。
*注意*
还有一点,但我必须跑出去。我稍后会更新。