Ответ 1
1. Каковы все соглашения об именах, о которых я должен знать?
Таблица db - множественное число, модель единственная, контроллер - множественное число. поэтому у вас есть модель User
, которая поддерживается таблицей users
и видна через UsersController
.
файлы должны быть названы как расширенная версия имени класса. поэтому класс FooBar
должен находиться в файле с именем foo_bar.rb
. Если вы используете пространство имен с модулями, пространства имен должны быть представлены папками. поэтому, если речь идет о классе Foo::Bar
, он должен быть в foo/bar.rb
.
2. Как структурировать именовать действия контроллера?
Действия контроллера должны быть RESTful. Это означает, что вы должны думать о своих контроллерах как об экспорте ресурса, а не о том, как просто разрешать RPC. Rails имеет концепцию действий членов и действий коллекций для ресурсов. Действие элемента - это то, что работает на конкретном экземпляре, например /users/1/edit
будет действительным элементом редактирования для пользователей. Действие коллекции - это то, что работает на всех ресурсах. Таким образом, /users/search?name=foo
будет действием коллекции.
В приведенных выше учебниках описано, как реально реализовать эти идеи в файле маршрутов.
3. Каковы наилучшие способы визуализации информации в представлении (через :content_for
или частичный) и какие способы я не должен использовать?
content_for
следует использовать, когда вы хотите добавить html из внутреннего шаблона в внешний шаблон - например, возможность добавить что-то из вашего шаблона в шаблон макета. Хорошим примером может быть добавление javascript, специфичного для страницы.
# app/views/layout/application.rb
<html>
<head>
<%= yield :head %>
...
# app/views/foobars/index.html.erb
<% content_for :head do %>
<script type='text/javascript'>
alert('zomg content_for!');
</script>
<% end %>
частичные файлы предназначены либо для разбивки больших файлов, либо для повторного отображения одного и того же бита информации. Например
<table>
<%= render :partial => 'foo_row', :collection => @foobars %>
</table>
# _foo_row.html.erb
<tr>
<td>
<%= foobar.name %>
</td>
</tr>
4.Что должно идти в помощник, а что нет?
ваши шаблоны должны иметь только базовую логику ветвления. Если вам нужно сделать что-нибудь более интенсивное, оно должно быть в помощнике. локальные переменные во взглядах являются мерзостью против всего, что хорошо и правильно в мире, так что это отличный признак того, что вы должны стать помощником.
Другая причина - просто повторное использование кода. Если вы делаете то же самое с небольшими вариациями снова и снова, потяните его в помощника (если это то же самое, оно должно быть в частичном).
5. Каковы общие ловушки или что-то, что мне нужно сделать правильно с самого начала?
Частичные части не должны ссылаться непосредственно на переменные instance (@), так как это предотвратит повторное использование строки. всегда передавайте данные через параметр:locals => { :var_name => value }
в функцию рендеринга.
Сохраняйте логику из своих представлений, которая напрямую не связана с рендерингом ваших представлений. Если у вас есть возможность сделать что-то в этом представлении и сделать это где-то еще, то 9 раз из 10, сделав это где-то в другом месте, это лучший вариант.
У нас есть мантра в рельсах, которая представляет собой "толстые модели, тощие контроллеры". Одна из причин заключается в том, что модели ориентированы на объекты, контроллеры являются процедурными. Другим является то, что модели могут пересекать контроллеры, но контроллеры не имеют перекрестных моделей. В-третьих, модели более проверяемы. Это просто хорошая идея.
6. Как вы можете модулировать код? Для чего предназначена папка lib?
папка lib предназначена для кода, который пересекает проблемы моделей (т.е. что-то, что не является моделью, но будет использоваться несколькими моделями). Когда вам нужно что-то там положить, вы узнаете, потому что вы не сможете определить, какую модель вставить. Пока это не произойдет, вы можете просто игнорировать lib.
Что-то, о чем нужно помнить, так это то, что с rails 3 lib не находится на пути автозагрузки, а это значит, что вам нужно require
все, что вы там вложили (или добавить его обратно)
Способ автоматического запроса всех модулей в каталоге lib
:
#config/initializers/requires.rb
Dir[File.join(Rails.root, 'lib', '*.rb')].each do |f|
require f
end