2010-08-25 2 views
0

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

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

Это пахнет чем-то, как высушить его путь Rails? Благодаря!

ответ

1

Во-первых, я бы рекомендовал использовать систему, подобную 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 

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

+0

Спасибо, Майк. Раньше я был в Authlogic + плагинах. Я перешел на личность пользователей, полностью привязанных к Facebook, поэтому средства для обработки и обработки паролей Authlogic стали посторонними, и я вынул их. Я закончил тем, что просто извлек некоторые функции плагинов authlogic в методы фильтрации. Существуют ли другие преимущества для разработки/authlogic, которые я могу упустить? – ambertch

+0

На самом деле, я действительно глуп - я проходил в этой сессии b/c Мне нужен токен доступа OAuth, который я вставлял в него, и не у всех пользователей есть один (некоторые из них «поддельные» пользователи). ОДНАКО, у меня есть архитектурная гарантия того, что любой модельный метод, который я передаю, для которого нужен токен доступа сеанса, имеет доступ к пользователю с токеном доступа. Еще раз спасибо Майку, ваш ответ помог мне все продумать. – ambertch

1

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

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

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

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

Я знаю, что это не рубин, но это будет выглядеть следующим образом:

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

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

+0

прохладный спасибо. Да, я думал о before_filter, чтобы сделать «если Model.object не существует, установите его для использования». Я предполагаю, что это можно сделать еще дальше, расширив суперкласс класса с помощью объекта. Я действительно задаюсь вопросом, не имеет ли Rails непонятного «рельсового пути», поскольку я так часто обнаруживаю случай :) – ambertch

+0

Да, это происходит со мной все время. Я разрабатываю DRY-решение самостоятельно, а затем Bam! Для этого уже был метод CakePHP. ;) – Stephen

0

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

класса ApplicationController < ActionController :: Base

before_filter: get_facebook_session

Защиту get_facebook_session

@facebook_session = <your code > 

конец

конец

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

ура

Sameera

+0

Это не касается вопроса о передаче его в модели, что и вызывало запах кода. –

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