如何在Ruby on Rails中实现部分视图对象

时间:2018-04-20 02:23:49

标签: ruby-on-rails ruby haml

我有一个像这样循环的视图:

- @pages.each do |page|
          = render 'page_item', page: page, disable_nesting: true

我想为'page_item' partial。

的演示实现一个视图对象

我知道视图对象的最佳实践是在控制器操作结束时实例化它们,但在这种情况下,这是不可能的,因为该操作适用于父视图而不是部分{{1 }}

我应该在哪里实例化此视图对象?

1 个答案:

答案 0 :(得分:0)

您可以为父模型创建演示者,以便在调用方法时为您构建子演示者:

# parent_presenter.rb

class ParentPresenter

  attr_reader :parent

  def initialize(parent)
    @parent = parent
  end

  def page_presenters
    parent.pages.map { |page| PagePresenter.new(page) }
  end
end

页面模型需要一个单独的演示者:

# page_presenter.rb

class PagePresenter

  attr_reader :page

  def initialize(page)
    @page = page
  end

  def presenter_method
    # Presentation logic here
  end
end

您的控制器操作如下所示:

# parents_controller.rb

class ParentsController < ApplicationController
  def show
    parent = Parent.find(params[:id])
    @parent_presenter = ParentPresenter.new(parent)
  end
end

现在,您可以这样做:

- @parent_presenter.page_presenters.each do |page_presenter|
      = render 'page_item', presenter: page_presenter, disable_nesting: true