2013-11-08 2 views
1

У меня есть некоторые вопросы о структуре контроллеров для ограничения дублирующего кода.Контроллеры рефакторинга

например, я хочу получить мужчин и женщин. Каков наилучший способ для этого:

class User { 

    public function men() { 
     //render 
    } 

    public function women() { 
     //render 
    } 

    //OR 

    public function by_type($type) { 
     //render 
    } 

} 

Это простой пример, но число типов может расти. И каждый тип может иметь отдельные виды. Я ищу решение для масштабирования на будущее. Лучшая практика для этого случая использования.

Благодаря

+0

Создайте отдельные фильтры для мужчин и женщин/классов, которые реализуют соответствующую логику для каждого, и добавьте этот фильтр/представление в метод 'by_type' вашего класса пользователя. –

ответ

0

Rails имеет (somewhat controversial) принципа, называемый fat model, skinny controller, который в основном означает, что вы можете использовать контроллер для обработки логики для представлений, и пусть модель обрабатывать «тяжелые» так, чтобы-говорить


CakePHP/Rails

для порта с CakePHP в Rails, я очень рекомендую посмотреть на использование модели как можно больше, так как она позволяет создать приложение, которое использует полную структуру производительности сервера, и не просто оставить все t он логика в контроллерах, так это то, что многие люди с CakePHP

Специально для Вашего вопроса:

#app/controllers/users_controller.rb 
def index 
    @user = User.gender(params[:gender]) 
end 

#app/models/user.rb 
def self.gender(type) 
    where?("type = ?", type) 
end 

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

Я вижу Rails как много другое, чем CakePHP, что это поможет вам создать действительно функциональные & содержательные приложения, которые используют весь сервер, а не просто предоставление слоя, чтобы сделать сайт динамичным

0

Насколько я понимаю ваш вопрос, вы можете вызвать функцию, которая на самом деле визуализации типа внутри функции by_type таким образом:

public function by_type($type) { 
    if (method_exist($this, $type) { 
     return call_user_func(array($this, $type)); 
    } 
    else { 
     throw new Exception('method do not exists!'); 
    } 
} 

Это так, как вам нужно только написать метод которые отображают тип и вызывают его с использованием метода by_type.

+0

. Я уже пробовал эту технику, но если логика отличается по типу, вроде сложно. Размер метода быстро растет – Fassbender

+0

Я хочу получить чистый и изменчивый контроллер – Fassbender

Смежные вопросы