Как мне провести рефакторинг RailC ApplicationController с константами, установленными в результаты ActiveRecord? - PullRequest
0 голосов
/ 09 июня 2011

Я работаю над проектом Rails 2.1, который имеет ApplicationController, подобный следующему:

class ApplicationController < ActionController:Base
  THIS_SITE = Site.find_by_url('www.example.net')
  ADMIN_ROLES = StaffRole.find(:all, :conditions => ["site_id = ? AND name IN (?)", ApplicationController::THIS_SITE.id, 'Administrator'])
end

Я не смог запустить тесты, потому что в моей тестовой среде я получал бы ошибку, говоря, что THIS_SITE - этоноль при попытке определить ADMIN_ROLES.Я исправил проблему, выполнив следующее:

class ApplicationController < ActionController:Base
  def self.this_site
    @@this_site ||= Site.find_by_url('www.example.net')
  end
  def self.admin_roles
    @admin_roles ||= StaffRole.find(:all, :conditions => ["site_id = ? AND name IN (?)", ApplicationController::this_site.id, 'Administrator'])
end

ApplicationController::THIS_SITE и ApplicationController::ADMIN_ROLES используются во всем приложении в представлениях, контроллерах и моделях.Я чувствую, что это все неправильно и грязно.Я ошибаюсь, думая, что это неправильно / грязно?Если нет, то как это можно изменить?

Спасибо.

1 Ответ

1 голос
/ 09 июня 2011

Ваша проблема в тестовом режиме заключается в том, что класс ApplicationController загружается даже до заполнения тестовой базы данных. И хотя нет никаких проблем с использованием констант как таковых; определение методов класса переносит загрузку из момента БД в будущее и позволяет вам запускать ваши тесты.

Однако я думаю, что "@@ this_site" в вашем коде должно быть "@this_site".

С точки зрения sys-architects и this_site, и admin_roles выглядят как настройки для каждого приложения и должны быть удалены из частей контроллера. Хорошее место для определения параметров приложения - ниже config / initializer или в вашей среде. Rb

Кстати: разве Rails 2.1 не слишком стар?

...