代码之家  ›  专栏  ›  技术社区  ›  Stéphan Kochen

我应该如何构造共享模板的控制器操作?

  •  0
  • Stéphan Kochen  · 技术社区  · 14 年前

    假设我有一个 User 模型和 Invoice 模型与A belongs_to :user 联想。

    现在我正在创建一个 new 我的行动 InvoicesController 以及将要呈现的视图。该视图将具有一个select元素,用于选择该发票所属的用户。

    所以我需要把这些用户带到某个地方;我的直觉是把这类事情抛在脑后。我最终得到的结果是:

    def new
      @users = User.all
    end
    

    表单提交操作是 create . 当创建由于某种原因失败时,我重新呈现 新的 行动的观点。

    def create
      invoice = Invoice.new params[:invoice]
      if invoice.save
        flash[:notice] = 'Invoice created!'
        redirect_to :action => 'show', :id => invoice.id
      else
        @users = User.all
        render :action => 'new'
      end
    end
    

    但正如你所看到的,为了重新渲染 新的 操作,我必须再次获取用户。

    这只是一个例子,但是考虑到我有一些表单,其中包含一些从数据库中填充的select元素,或者类似的构造。这变成了一个可怕的重复。

    那么在这种情况下,我应该如何构造控制器呢?

    • 我应该简单地使用吗 User.all 依我看?
    • 我应该打电话吗? 新的 从内部 创造 为我做取物?
    • 或者别的什么?
    2 回复  |  直到 14 年前
        1
  •  2
  •   jonnii    14 年前

    为此,我将使用 before_filter . 例如,您可以执行以下操作:

      before_filter :fetch_all_users, :only => [:new, :create]
    
    protected
    
      def fetch_all_users
        @users = User.all
      end
    

    对于90%的控制器,我使用 inherited resources 插件。它减少了您需要为CRUD控制器编写的控制器代码的数量,这也意味着您可以减少您需要编写的测试的数量。

        2
  •  0
  •   Community SqlRyan    7 年前

    为了我:

    What's the rails way to load other models collections for new, edit update and create actions?

    这对我的处境来说不是个好办法。如果在“.save”之后使用,我会将重定向发送到另一个操作,如果在“filter”和“.save”之前使用,则返回“true”,则会将fetch“all”用户称为“unnecessary”。