0

我需要有关 Rails 最佳实践的建议。实际上,在我的应用程序中,对于我cars_controller和我,contacts_controller我需要为 、 和 actions 中的两个控制器加载数据new(如下)createeditupdate

@countries        = Country.all
@types            = Type.all
@departments      = Department.all
@models           = Model.all // This one is only needed on contacts_controller

那些将被填充到选择框中。由于我需要在每个new,和动作上重复它,我在create我的:editupdateload_resourceapplication_controller

application_controller.rb

def load_resources
  @countries        = Country.all
  @types            = Type.all
  @departments      = Department.all
  @models           = Model.all // This one is only needed on contacts_controller
end

但是,我真的觉得很脏,如果我想为其他控制器加载其他数据怎么办?我想知道是否有最好的做法?

我尝试使用 Presenter 模式,但由于这些数据没有特别附加到任何东西,因为它们只是选择框中的数据,所以它真的不起作用。

谢谢你的帮助

4

1 回答 1

3

我可以看到两个可能的改进,首先您不需要在每个操作上加载资源,其次您可以使用缓存来提高性能。

不要在每个动作上加载资源

create假设您遵循标准 REST 约定,如果这些资源用于您的下拉菜单,则在和中不需要它们update。您只需要在newand中使用它们edit,因为只有这两个操作向用户显示页面。create并且update是您的表单调用的操作,并将重定向到其他页面。

我不会将其添加到您的application_controller中,而是将 a 添加before_filter到您的contacts_controllerandcars_controller

联系人控制器.rb

before_filter :load_resources_for_dropdowns, :only => [:new, :edit]

def load_resource_for_dropdowns
  ....
end

使用缓存

此外,如果您担心从数据库加载资源对性能的影响,您可以考虑对其使用缓存。例如,如果您的国家/地区列表从未更改,您可以安全地执行以下操作:

国家.rb

def get_all_cached
  Rails.cache.fetch('all_countries') { Country.all }
end

联系人控制器.rb

before_filter :load_resources_for_dropdowns, :only => [:new, :edit]

def load_resource_for_dropdowns
  @countries = Country.get_all_cached
end

如果您的国家/地区确实发生了变化,您可以添加检查以在发生变化时清除缓存:

国家.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
于 2013-10-04T03:36:52.133 回答