我正在尝试确定如何保持我的控制器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
我在考虑我的做法是错的,很乐意接受教育。我想重申一下“只使用默认初始化的模型渲染部分”不是答案。
答案 0 :(得分:2)
如果我理解您的问题,您需要的是partial。
根据您的示例,您可以在views / shared中创建名为_contact_form.html.erb
的部分模板。因此,您可以在应用程序的多个视图中添加“联系我们”表单。要保持DRY,请使用创建操作创建一个新控制器contact_controller.rb
,以处理表单中发送的信息。
希望这有帮助。