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

时间:2010-02-01 19:24:29

标签: ruby-on-rails

假设我有一个User模型,以及一个Invoice模型与belongs_to :user关联。

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

所以我需要在某处获取这些用户;我的直觉是将这种事情排除在视野之外。我最终得到了这个:

def new
  @users = User.all
end

表单提交操作为create。当创建因某种原因失败时,我会重新呈现new操作的视图。

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

但正如您所看到的,为了重新呈现new操作,我必须再次获取用户。

这只是一个例子,但我认为我有一些表格,其中包含从数据库填充的几个select元素或类似的结构。这变成了非常多的重复。

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

  • 我应该从我的视图中使用User.all吗?
  • 我应该从new内拨打create给我取物吗?
  • 还是其他什么?

2 个答案:

答案 0 :(得分:2)

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

  before_filter :fetch_all_users, :only => [:new, :create]

protected

  def fetch_all_users
    @users = User.all
  end

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

答案 1 :(得分:0)

对我来说:

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

对我的情况来说,这不是一个好方法。如果我使用before_filter和" .save"返回true,fetch_all_users被称为不必要的