阻止视图访问模型

时间:2018-04-27 13:41:39

标签: ruby-on-rails ruby ruby-on-rails-4

为了强制分离关注点并防止大项目视图中的脏黑客,我想在视图中注入数据(例如通过控制器),然后视图将无法访问模型或项目的任何类别(仅注入的数据结构)。

使用Rails,我们如何防止视图中的嵌入式Ruby代码访问项目的其他部分?

1 个答案:

答案 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

现在,该视图不再能够访问除演示者之外的任何内容。

*注意*

还有一点,但我必须跑出去。我稍后会更新。