我需要有关Rails最佳实践的建议。实际上在我的应用程序中,对于我的cars_controller
和我的contacts_controller
,我需要为new
,create
,edit
和{中的两个控制器加载数据(如下) {1}}行动:
update
那些将填入选择框。由于我需要在每个@countries = Country.all
@types = Type.all
@departments = Department.all
@models = Model.all // This one is only needed on contacts_controller
,new
,create
和edit
操作上重复此操作,因此我在update
中创建了load_resource
:< / p>
application_controller.rb
application_controller
但是,对我来说真的很脏,如果我想为其他控制器加载其他数据怎么办?我想知道是否有最佳实践?
我尝试使用Presenter模式,但由于这些数据并非特别附加到任何内容,因为它们只是选择框中的数据,所以它确实不起作用。
感谢您的帮助
答案 0 :(得分:3)
我可以看到两个可能的改进,首先你不需要在每个动作上加载资源,其次你可以使用缓存来提高性能。
假设您遵循标准REST约定,如果这些资源用于您的下拉菜单,则create
和update
中不需要它们。您只需在new
和edit
中使用它们,因为只有这两个操作才会向用户显示一个页面。 create
和update
是您的表单调用的操作,并会重定向到其他页面。
我只需在application_controller
和before_filter
contacts_controller
,而不是将其添加到cars_controller
。
<强> contacts_controller.rb 强>
before_filter :load_resources_for_dropdowns, :only => [:new, :edit]
def load_resource_for_dropdowns
....
end
此外,如果您担心从数据库加载资源会对性能产生影响,可以考虑使用缓存。例如,如果您的国家/地区列表从未更改过,则可以安全地执行以下操作:
<强> country.rb 强>
def get_all_cached
Rails.cache.fetch('all_countries') { Country.all }
end
<强> contacts_controller.rb 强>
before_filter :load_resources_for_dropdowns, :only => [:new, :edit]
def load_resource_for_dropdowns
@countries = Country.get_all_cached
end
如果您的国家/地区确实发生了变化,您可以添加一项检查,以便在发生变化时清除缓存:
<强> country.rb 强>
after_save :clear_cache
def clear_cache
Rails.cache.delete('all_countries')
end
def get_all_cached
Rails.cache.fetch('all_countries') { Country.all }
end