Нужна помощь с запахом кода - PullRequest
0 голосов
/ 26 августа 2010

В моем приложении на Rails я пытаюсь сделать контроллеры более тонкими и испытываю трудности с одним объектом, который мне постоянно приходится проходить.

Объект представляет сеанс Facebook пользователя и создается вне сеанса, поэтому он существует на стороне контроллера. Многие методы модели используют его, поэтому он постоянно передается в качестве аргумента повсюду.

Это пахнет чем-то, как высушить его по Rails? Спасибо!

Ответы [ 3 ]

1 голос
/ 26 августа 2010

Во-первых, я бы порекомендовал использовать систему, аналогичную Authlogic для вашей аутентификации.Это дает вам два бонуса:

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

class Widget < ActiveRecord::Base
  def do_facebook_stuff
    UserSession.find #This gets you the current session
    UserSession.find.record # This gets your the user for the current session
  end
end

Теперь вам больше не нужно передавать информацию о сеансе, поскольку вы можете выполнить базовый поиск в стиле модели, чтобы найти ее.В дополнение к этому Authlogic имеет подключаемую архитектуру, которая поддерживает Facebook Connect , что может помочь вам в дальнейшем.

1 голос
/ 26 августа 2010

Я могу дать вам способ CakePHP (который изначально был разработан как рельсы).

Все модели CakePHP расширяют один и тот же родительский AppModel, а все контроллеры расширяют AppController.

Я бы сделал пустой параметр в AppModel, который представляет ваш объект. Затем в AppController я бы сохранил объект в параметре текущей модели, если объект существует. В CakePHP AppController есть обратный вызов beforeFilter (), который запускается перед любым кодом в контроллере. Идеальное место для проверки объекта и его сохранения в модели - это любой эквивалентный Rails этого обратного вызова beforeFilter.

Это если все модели не используют объект. Если это так, вы можете поместить параметр только в Модели, которые его используют (вместо родителя), а затем в beforeFilter AppModel вы можете сначала проверить, имеет ли Модель этот пустой параметр.

Я знаю, что это не Ruby, но это будет выглядеть так:

public function beforeFilter() {
    if (isset($this->{$this->modelName}->yourObjectParameter)) {
        $this->{$this->modelName}->yourObjectParameter = $this->yourObject;
    }
}

$this->modelName - строка, соответствующая названию текущей модели. { } вокруг $this->modelName в PHP называется сложным синтаксисом. Он в основном преобразует строку в объект модели. Не уверен, как сделать то же самое в Ruby.

0 голосов
/ 26 августа 2010

Вы можете перенести свой метод на контроллер приложения, что-то вроде этого

класс ApplicationController

before_filter: get_facebook_session

def get_facebook_session

@facebook_session = <your code >

конец

конец

И вы можете получить доступ к переменной @facebook_session из своих контроллеров и представлений

ура

Sameera

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...