Хорошая практика 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
где-нибудь (скорее всего, ниже) в коде класса контроллера!