Окремі чи множинні назви контролерів та помічників у Rails


112

Чи є якийсь недолік у використанні одних імен для контролерів та помічників? Здається, ніщо не покладається на це. Здається навіть, що помічники не повинні робити той самий вибір щодо однини проти множини, як їх відповідні контролери, принаймні згідно з моїм обмеженим експериментом. Це правда?


2
У мене була така ж дилема, намагаючись визначити назви єдиного чи множинного контролера!
Андрій

15
дякую :) Культура рейок - це спосіб змусити себе почувати себе дурним, якщо ставите під сумнів такі речі.
allyourcode

Відповіді:


158

Однозначно множина .

З спокійною маршрутизацією та синхронним контролером

Контролер:

dog_controller.rb  

Маршрути:

map.resources :dogs  # => blows up  
map.resources :dog  # is ok, but...  
dogs_path # => blows up  
dog_path  # => ok  

Використання контролера множини

Контролер:

dogs_controller.rb

Маршрути:

map.resources :dogs  
dogs_path # => ok  
dog_path # => ok  

rails generate controller --help має множинні приклади:

Example:
`rails generate controller CreditCards open debit credit close`

CreditCards controller with URLs like /credit_cards/debit.
    Controller: app/controllers/credit_cards_controller.rb
    Test:       test/controllers/credit_cards_controller_test.rb
    Views:      app/views/credit_cards/debit.html.erb [...]
    Helper:     app/helpers/credit_cards_helper.rb

23
домовились. Заплутано те, що в довідковому повідомленні генератора Rails 3.1 для контролерів використовується "CreditCard" (єдиний) як приклад.
bantic

4
Допомога Rails тепер використовує множину: рейки генерують контролер CreditCards відкритий дебетовий кредит закрити
notapatch

3
Тут ще є сингулярна CreditCard: guides.rubyonrails.org/command_line.html#rails-generate
rcrogers

Як ми можемо написати локалі для сингулярного контролера stackoverflow.com/questions/29650094 / ...
Сантош

Тож іменування повинно бути множинним та великим слів. напр .:: рейки генерують контролер Собаки новий індекс створюють видалення знищують редагувати "??
BKSpurgeon

27

Використання множинних імен для контролерів є лише умовою.

Назви множини зазвичай звучать більш природно (особливо для контролерів, які прив’язані безпосередньо до конкретної моделі: Користувач -> Користувачі тощо), але ви можете використовувати все, що завгодно.

Що стосується помічників, то всі помічники за замовчуванням доступні для всіх контролерів, тому технічно те, як називати своїх помічників, зовсім не має значення. Це просто ще одна умова утримувати помічники контролера в помічнику з тим же ім'ям, що і контролер.


10
Чи не було б більш природним, щоб контролер, що відповідає користувачеві, був UserController ?? Крім того, якщо ви покладаєтесь на маршрути за замовчуванням, ви отримуєте URL-адреси, які виглядають / користувачі / редагувати, що виглядає так, як ви редагуєте всіх користувачів. Для мене це зовсім не природно.
allyourcode

5
@allyourcode: ну, мабуть, це все суб'єктивно. для мене, наявність / список користувачів усіх природних, ніж / користувач.
Може Берк Гюдер

1
о, і це РІЗНИЙ шлях.
Може Берк Гюдер

3
@Can "RESTful way" звучить як культове спів. Це насправді не дивує мене, оскільки Рейлс в цілому досить релігійний. Мені подобається, як Rails весь одержимий REST, але маршрути за замовчуванням не є спокійними. Навіть налаштування маршрутів RESTful є неприродним. Включення: умови => {: метод =>: пост} у другий аргумент для підключення не має сенсу, оскільки хеш повинен визначати, як обробляти будь-який запит, який відповідає поточному правилу, а не відповідати який-небудь заданий запит поточному правилу .
allyourcode

2
@allyourcode Відповідно до цього маршрутом для редагування за замовчуванням є / users /: id / edit замість / users / edit. Говорячи "від усіх користувачів, відредагуйте користувача за допомогою id: id" для мене звучить абсолютно природно.
DavidG

19

Модель є сингулярною, оскільки вона посилається на один об'єкт, як User. Контролер є множиною, оскільки це елементи керування (методи) для збору користувачів. Як називати маршрути, все залежить від конкретного розробника. Я ніколи не скаржився, що URL-адреса веб-запиту є одниною чи множиною. Кінцевим результатом є підтримка загальної конвенції для поточних та майбутніх дописувачів під час обслуговування відображень сторінок якості або запитів API для кінцевих користувачів.


12

Ви маєте дуже повне пояснення в посібниках по Rails: http://edgeguides.rubyonrails.org/routing.html#resource-routing-the-rails-default


4
насправді це правильна відповідь b / c, якщо ви її читаєте, це пояснює, що множина - це правильна відповідь для збору ресурсів. Для одиночного ресурсу однина - правильна відповідь. Приклади в документації. І власне, на це добре відповіли в цьому іншому дописі: stackoverflow.com/questions/2614858/…
Роб

Відповіді, підкріплені офіційними посиланнями, як у цій публікації, дуже допомагають новачкам! Дякую
Васіф Хоссайн

9

Це умова Rails, що один контролер обробляє одну модель, чи може існувати один або кілька екземплярів цієї моделі під час виконання. Однак ви можете мати додаток Rails, де (деякі) контролери (та пов'язані з ними види) не пов'язані з якоюсь конкретною моделлю, а швидше обробляють більш складний набір функціональних можливостей. У цьому випадку автоматична плюралізація не має жодного сенсу.

Додаток Rails, над яким я зараз працюю, вписується в цю категорію, і для мене це просто роздратування, що Rails очікує, що ідентифікатори, які я визначаю як однини в одному місці, потім будуть використовуватися в їхніх множинних формах в інших місцях. Наприклад, я б хотів визначити щось подібне в config/routes.rb:

  resource :dashboard, :only => [:show]

і тоді я хочу, щоб контролер DashboardControllerвідображав підсумкову інформацію про певні аспекти програми, збираючи інформацію з більш ніж однієї таблиці баз даних. Тож тут Dashboardне посилається ні на яку модель програми, і було б просто дивно, щоб ім'я контролера було DashboardsController.

У цій відповіді я знайшов вдале рішення для роздратування автоматичної плюралізації . Коротше кажучи, відредагуйте файл config/initializers/inflections.rbта додайте слова, які ви не хочете, щоб вони були автоматично додані до цього визначення:

ActiveSupport::Inflector.inflections do |inflect|
  inflect.uncountable %w( dashboard foo bar baz )
end

3

Конвенція про іменування контролерів у Rails сприяє множенню останнього слова в імені контролера, хоча це не обов'язково (наприклад ApplicationController).

Наприклад, ClientsControllerє переважним ClientController, SiteAdminsControllerє кращим SiteAdminController або SitesAdminsControllerтощо.

Дотримання цієї конвенції дозволить вам використовувати генератори маршрутів за замовчуванням (наприклад, ресурси тощо) без необхідності кваліфікувати кожен :pathабо :controller, а також буде підтримувати послідовність використання помічників URL-адрес та шляхів у всій програмі.

Довідка: Контролер, що називає Конвенцію-рейки, док



2

Якщо контролер - це ресурс, то він повинен бути множинним ...

Наприклад

Контролер

articles_controller.rb

Модель

article.rb

Але ви можете використовувати особливі імена контролерів, коли у вас немає відповідних моделей, таких як

welcome_controller.rb

1

Використання множини просто звучить краще, і тоді, якщо у вас є контролер, який обробляє єдиний ресурс, тобто користувач, то ви все одно можете назвати URL / користувач.

З помічниками часто не потрібно мати помічників для кожного контролера, і часто існують допоміжні методи, якими ви можете скористатися декількома контролерами ascorss і скоріше засмітити їх через ваш помічник програми, ви можете помістити їх у спеціальні помічники замість, наприклад, layout_helper або будь-який інший інший добре названий файл.


Ті ж коментарі, що і до Can Berk Guder. Окрім того, у мене виникли певні проблеми після останнього речення / абзацу, оскільки пунктуації було так мало!
allyourcode

1
Вибачте з цього приводу, все, що я мав на увазі, може бути кращою ідеєю створити власні помічники, а не використовувати типові параметри, оскільки ім’я за замовчуванням не завжди фіксують повністю там, де вони будуть використовуватися. Якщо у вас є кілька допоміжних методів, які будуть використовуватися для компонування, назвіть це layout_helper.
nitecoder
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.