Краткое изложение основных концепций Ruby on Rails - PullRequest
34 голосов
/ 05 марта 2011

Будучи новичком в Rails, я испытываю трудности с поиском веб-сайта или ссылки, которая дает краткий обзор Ruby on Rails. Я понимаю MVC, ActiveRecord и тому подобное на базовом уровне, но мне трудно понять некоторые взаимосвязи и основы. Например:

  1. Какие соглашения о присвоении имен мне необходимо знать?
  2. Как должны быть структурированы и названы действия контроллера?
  3. Каковы наилучшие способы визуализации информации в представлении (через :content_for или render частичное) и какие способы мне не следует использовать?
  4. Что должно быть у помощника, а что нет?
  5. Какие распространенные подводные камни или что-то, что мне нужно сделать правильно с самого начала?
  6. Как вы можете модулировать код? Для этого и предназначена папка lib

Я прочитал несколько ответов на StackOverflow по этому вопросу, но все они просто указывают на книгу на 300 с лишним страниц, которую мне нужно прочитать, тогда как я просто хочу получить краткое изложение того, что важно.

Некоторые ресурсы, о которых я уже знаю, но не предлагают краткое изложение основных концепций для новых пользователей:

  • http://railscasts.com/ (хорошо, но фрагментировано)
  • http://guides.rubyonrails.org/ (предполагается, что вы уже понимаете отношения между всем)
  • http://ruby.railstutorial.org/ (рисовать по цветам, нет хорошего резюме)
  • Rails AntiPatterns (отлично, но вы должны прочитать все это, прежде чем что-то понять)
  • Rails 3 Way (отлично, но опять же, вы должны прочитать все это, прежде чем что-то понять)

Спасибо за любую помощь, рекомендации или рекомендации, которые вы можете предоставить!

P.S. I would like this wiki to become a living document, so please add to it, edit it, etc. as you feel necessary.

Ответы [ 2 ]

63 голосов
/ 05 марта 2011

1. Какие соглашения о присвоении имен мне нужно знать?

Таблица дБ - множественное число, модель - единственное число, контроллер - множественное число. Таким образом, у вас есть модель 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. Какие распространенные подводные камни или что-то, что мне нужно сделать правильно с самого начала?

partials не должен никогда напрямую ссылаться на переменные экземпляра (@), так как это предотвратит повторное использование в дальнейшем. всегда передавайте данные через параметр :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
2 голосов
/ 29 ноября 2017

Некоторое время назад я написал несколько соглашений об именах:

Соглашения Rails

Общие

Все имена файлов приведены в snake_case в соответствии с теми же соглашениями - Модель: единственное число (например, Restaurant) - Контроллер: множественное число (например, RestaurantsController) - Таблица в БД: множественное число (например, restaurants) - URL-адреса: все в множественном числе (например, /restaurants, /restaurants/:id, /restaurants/new)

rails generate Команды

  • Создать модель: единственное число (потому что название модели в единственном числе).например, rails g model Restaurant name:string rating:integer
  • Создать миграцию: множественное число (потому что мы используем имя таблицы).например, rails g migration AddDescriptionToRestaurants description:text
  • Создать контроллер: множественное число Например, rails g controller Restaurants index show

Модель (в единственном числе)

ActiveRecord методы

Все в единственном числе, потому что все методы ActiveRecord связаны с моделью.Примеры: - Restaurant.all - Restaurant.create(name: "Burger King", rating: 2) - Restaurant.find(params[:id])

Ассоциации

  • Единственное число в belongs_to.Потому что он принадлежит одному элементу.
  • множественному числу в has_many.Потому что он имеет много элементов.

например

class Restaurant < ActiveRecord::Base
  has_many :reviews
end

class Review < ActiveRecord::Base
  belongs_to :restaurant
end

Маршруты

Ресурсы

Plural при определении маршрута для ресурса:

resources :restaurants

Помощники маршрутов

  • index: во множественном числе (поскольку мы показываем список элементов).например, restaurants_path.Может также использоваться для create.
  • show: единственное число (мы показываем только один элемент, ему нужен элемент внутри скобки ).например, restaurant_path(@restaurant).Может также использоваться для update & delete.
  • new: единственного числа .например, new_restaurant_path
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...