Соглашение Rails для метода в нескольких контроллерах - PullRequest
4 голосов
/ 07 февраля 2012

У меня есть приложение, в котором есть пользователи, чьи профили доступны через site.com/username.При выборе имени пользователя я выполняю AJAX-вызов метода в моем UsersController, чтобы убедиться, что имя пользователя доступно (и проверять также и внутреннюю часть при отправке).Теперь я хочу добавить группы, которые также будут доступны через site.com/groupname.Поскольку имена групп и пользователей не могут конфликтовать, любой метод контроллера, который отвечает на вызов AJAX, должен будет проверять оба, поэтому методы check_username_available и check_groupname_available будут делать одно и то же.Каков наилучший способ / Rails способ справиться с этим, поскольку я не хочу реплицировать код как в UsersController, так и в GroupsController?

Наличие метода для каждого контроллера кажется несколько избыточным, даже если функциональность отключенапомощник, так как все еще будут два маршрута, которые делают то же самое.Наличие отдельного контроллера тоже решает проблему, но не уверен, что это хорошая практика Rails.

Ответы [ 2 ]

4 голосов
/ 03 марта 2012

код, который используется повторно, может быть передан через модуль

class UsersController < ActionController::Base
  include NameUniqueness
end

class GroupsController < ActionController::Base
  include NameUniqueness
end

module NameUniqueness
  protected
  def check_name
    # implementation here
  end
end

теперь оба контроллера будут иметь доступ к методу экземпляра check_name.

0 голосов
/ 03 марта 2012

Ответ ДанПикетта великолепен.

Другой вариант - создать метод класса в пользовательской модели и просто вызывать его из каждого контроллера. Поскольку эта проверка имени выглядит как работа для модели, я бы так и сделал.

class User
    def self.check(stuff) ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...