我如何在当前控制器中包含另一个ActionController视图的输出?

时间:2013-09-07 02:11:54

标签: ruby-on-rails

我正在尝试确定如何保持我的控制器DRY,并且我可以将其视为应用程序中许多位置中包含的子视图(或其他平台中的控件)。

是否有典型的RoR DRY方法来处理这个问题?

示例,如果有帮助,可能是“评价此页面”类型控件/视图。它将包含在不同类型的页面控制器中,并不会将我视为给定页面控制器的“扩展”。另一个合适的例子可以是没有“专用”视图的“联系我们”表格。

这是另一个没有回答的类似问题:https://stackoverflow.com/questions/18408016/initializing-object-for-modal-form

唯一的评论承认他们提出的解决方案违反了标准设计惯例。

更多详情:

视图的一个元素(有些人可能认为它是一个控件)需要访问会话数据(加载用户特定的数据,或确保用户只允许每个会话执行一次,等等),访问验证信息(用于帖子上的错误处理),可能包含在不同的视图中。

我目前正在尝试“修复”的问题是,在元素包含在已经具有视图特定逻辑和输出的视图中的情况下“干掉”代码。

因此,我们以联系表​​单元素为例。我希望客户能够在大多数页面的底部提交消息(不同的控制器显然构成了站点)。其中一个控制器碰巧是一个带有一些数据库输出的新闻页面(文章)。因此,这个控制器已经设计用于管理新闻文章及其观点。为什么我会在该控制器中为联系表单添加初始化程序?如果用户尝试发布无效表单,谁会收到错误?我认为错误应该是内联的,所以现在必须重新填充新闻文章,并且联系表单需要适当地提醒用户。

class PageController < ApplicationController
  before_filter :collect_for_output


  def collect_for_output
    # some kind of business logic for grabbing the correct articles for
    # page we're on
    @articles= Article.all
  end

  def index
    # this initialisation doesn't belong in this controller
    # it should be in its own controller
    # I'm talking about initialisation that is dependent on session data
    # Say for a supplied name field I might pre-populate it with the
    # current users's name, otherwise allow it to be sent anonymously
    @message = Message.new
  end

  def post_message
    # this does *not* belong here but how else do I handle validation
    # in the current view?!? also how do I determine which view in this
    # controller made the post
  end
end


class NotAPageController < ApplicationController
  # this controller is nothing like a PageController, but I might
  # want the contact view available in these views too... how do I handle
  # the initialisation? (in these cases I'm talking about common
  # initialisation)
end

我在考虑我的做法是错的,很乐意接受教育。我想重申一下“只使用默认初始化的模型渲染部分”不是答案。

1 个答案:

答案 0 :(得分:2)

如果我理解您的问题,您需要的是partial

根据您的示例,您可以在views / shared中创建名为_contact_form.html.erb的部分模板。因此,您可以在应用程序的多个视图中添加“联系我们”表单。要保持DRY,请使用创建操作创建一个新控制器contact_controller.rb,以处理表单中发送的信息。

希望这有帮助。