我对管理控制器中的实例变量感到不知所措,所以我在想是否有更好的方法来管理它们。
我的情况是,我有一个处理首页渲染的PagesController
。在首页中,我有多个最初属于不同控制器的小表单(例如,创建一个新的表单,并且有一个专门用于它的PostsController,但为方便起见,您可以在首页轻松发布。)和他们都需要相应的实例变量来保存表单(例如,新的表单需要@post对象)。
事实证明,我必须手动将这些实例变量添加到我的PagesController#index
中才能使表单正常工作,所以很多行只是
@post = Post.new # similar for other objects
@some_other_var = OtherController.new # another one
@one_more = AnotherController.new # again
# even more @variables here when the website is big
如果这看起来不够糟糕,请考虑何时create
或edit
操作失败(例如未通过验证),我们需要渲染上一页。我们需要添加这些行AGAIN。实际上,只要有渲染,我们就需要包含所有这些变量。
将这样的代码手动输入到需要它们的每个动作似乎非常麻烦,当网站变得复杂时,很容易错过其中的一个或两个。
所以我想知道是否有更好的方法来管理这些变量,这样我们只需要包含它们一次,而不是每次都编写相同的代码。
答案 0 :(得分:2)
您可以创建before_filter
之类的内容:
class ApplicationController < ActionController::Base
...
...
protected
def instance_variables_for_form
@post = Post.new # similar for other objects
@some_other_var = OtherController.new # another one
@one_more = AnotherController.new # again
# even more @variables here when the website is big
end
end
并使用它:
class PagesController < ApplicationController
before_filter :instance_variables_for_form, only: [:action]
...
...
end
然后您可以在需要时通过任何操作明确地调用它。
答案 1 :(得分:0)
如果可以对这些变量进行逻辑分组,则应考虑将它们放入Presenter对象中。
这是一篇很好的博客文章,解释了这个想法:http://blog.jayfields.com/2007/03/rails-presenter-pattern.html