Rails需要有关最佳实践的建议

时间:2013-10-04 00:14:44

标签: ruby-on-rails

我需要有关Rails最佳实践的建议。实际上在我的应用程序中,对于我的cars_controller和我的contacts_controller,我需要为newcreateedit和{中的两个控制器加载数据(如下) {1}}行动:

update

那些将填入选择框。由于我需要在每个@countries = Country.all @types = Type.all @departments = Department.all @models = Model.all // This one is only needed on contacts_controller newcreateedit操作上重复此操作,因此我在update中创建了load_resource:< / p>

application_controller.rb

application_controller

但是,对我来说真的很脏,如果我想为其他控制器加载其他数据怎么办?我想知道是否有最佳实践?

我尝试使用Presenter模式,但由于这些数据并非特别附加到任何内容,因为它们只是选择框中的数据,所以它确实不起作用。

感谢您的帮助

1 个答案:

答案 0 :(得分:3)

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

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

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

我只需在application_controllerbefore_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