假设我有一个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
给我取物吗?答案 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被称为不必要的