在rails控制器中打包实例变量?

时间:2013-10-20 03:26:07

标签: ruby-on-rails ruby web

我对管理控制器中的实例变量感到不知所措,所以我在想是否有更好的方法来管理它们。

我的情况是,我有一个处理首页渲染的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

如果这看起来不够糟糕,请考虑何时createedit操作失败(例如未通过验证),我们需要渲染上一页。我们需要添加这些行AGAIN。实际上,只要有渲染,我们就需要包含所有这些变量。

将这样的代码手动输入到需要它们的每个动作似乎非常麻烦,当网站变得复杂时,很容易错过其中的一个或两个。

所以我想知道是否有更好的方法来管理这些变量,这样我们只需要包含它们一次,而不是每次都编写相同的代码。

2 个答案:

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