Хорошая практика Rails

Я ищу примеры хороших практик при использовании Rails.

У меня есть пара таких, как:

  • before_filter вызовы идут под объявлением имени класса контроллера, нигде больше.
  • Базовые контроллеры для пространства имен называются BaseController, а не ApplicationController. Существует и должно быть навсегда только одно ApplicationController.
  • attr_* методы определяются в верхней части их соответствующих классов.
  • Обратные вызовы модели идут после методов attr_* или в верхней части модели.
  • Проверки выполняются в верхней части модели, а пользовательские методы проверки определяются как методы private в нижней части файла.

Теперь я не ищу хороших практик Ruby, но больше перечисляет их в Rails. Те, что перечислены выше, являются лишь примером, а не Евангелием.

* Я не хотел использовать термин "лучшие практики", так как лучше всего подразумевает конечный, и во всем кодексе люди могут не согласиться.

Ответы

Ответ 1

Одна из практик, которую я считаю довольно последовательной, - это круглые скобки. Макросы класса DSL, такие как проверки и ассоциации, кажутся естественными без них, тогда как методы с явным приемником и аргументом (-ами) кажутся лучше с ними.

has_many :users

User.find_all_by_field(my_var)

против

has_many(:users)

User.find_all_by_field my_var

Ответ 2

  • Я положил attr_accessible* после объявления has_*.
    Я помню, чтобы получать ошибки, если я не объявлял их в вышеуказанном порядке. (Завтра я заново воссоздаю эту проблему и подтвержу)

    Пробовал:

    Работает:

    has_one :something
    accepts_nested_attributes_for :something
    

    Но это порождает ошибку:
     No association found for name 'something'. Has it been defined yet?:

    accepts_nested_attributes_for :something
    has_one :something
    

    Я думаю, причина, по которой я получаю эту ошибку, заключается в том, что я использую something в scope перед вызовом has_one.

  • Если вы делаете @posts.something и получаете ошибки nil в представлении (скажем, в индексе), но знаете, что @posts = Post.find в действии индекса работает, убедитесь, что у вас нет другого (большинство вероятно, пустой) def index где-нибудь (скорее всего, ниже) в коде класса контроллера!