2011-04-15 10 views
5

Dodaję omniauth do aplikacji szynowej 2.3.11 z devise. Zasadniczo śledzę obraz Ryana Bate'a railscast (z odpowiednimi modyfikacjami dla szyn 2.3). Ale widzę coś bardzo dziwnego w testowaniu tej części kodu:find_or_create_by wiele atrybutów nie znajdowanie rekordów po wywołaniu w kontekście obiektu belongs_to (błąd AR w 2.3.11?)

class AuthenticationsController < ApplicationController 
    ... 

    def create 
    auth = request.env["omniauth.auth"] 
    current_user.authentications.find_or_create_by_provider_and_uid(auth['provider'], auth['uid']) 
    flash[:notice] = "Authentication successful." 
    redirect_to authentications_url 
    end 

    ... 
end 

Funkcja find_or_create zawsze tworzy. W dzienniku, widzę to wybierz:

SELECT * FROM `authentications` WHERE (`authentications`.`provider` IN ('facebook','XXXXXXX') AND `authentications`.`uid` IS NULL) AND ((`authentications`.`user_id` = 10)) LIMIT 1 

To nie jest prawo wybierz dla tej metody. auth ['provider'] i auth ['uid'] są zapełniane poprawnie (i to właśnie tworzy nowy rekord).

Bardziej kłopotliwy: jeśli wejdę do konsoli i wykonam Authentication.find_or_create_by_provider_and_uid('facebook', 'XXXXX'), działa dobrze (znajduje istniejący rekord). Ale jeśli dostanę użytkownika i zrobię user.authentications.find_or_create_by_provider_and_uid('facebook', 'XXXXX'), utworzy on nowy rekord i widzę tę samą problematyczną instrukcję zapytania w dzienniku.

Wiem, że mogę obejść to (i Ryan Bates zmienia ten kod później), ale jest to bardzo kłopotliwe. Czy brakuje mi czegoś lub czy wygląda to jak błąd w ActiveRecord?

To nie jest specyficzne dla OmniAuth lub Devise. Przed przesłaniem tego spróbowałem go z dwiema innymi klasami (raczej proste klasy). Ten sam wynik [Klass.find_or_create_by_a_and_b ("A", "B") działa, ale parent.klasses.find_or_create_by_a_and_b ("A", "B") generuje selekcję, która chce, aby b było zerowe i a in ("A", "B" ")].

Teraz zdecydowanie myślę, że to błąd 2.3.11. Czy przed zgłoszeniem błędu ktoś widzi wszystko, czego mi brakuje? Czy ktoś widział ten problem?

+1

Brzmi jak robaka. Prześlij go do projektu szyn. –

Odpowiedz

0

Jakie są wartości auth ['provider'] i auth ['uid']? Może się mylę, ale wydaje mi się, że auth ['provider'] to ['facebook', 'XXXXXXX'] a auth ['uid'] jest zerowe.

1

Właśnie zaktualizowałem aplikację z Rails 2.3.10 do 2.3.11 i też natknąłem się na ten błąd.

W naszym kodzie, mamy:

 rate_plan = lodging.rate_plans.find_or_create_by_primary_code_and_secondary_code(rate_plan_code, inv_type_code) 

który pracował w porządku pod 2.3.10. Pod 2.3.11 plan taryfowy jest nowym rekordem, mimo że find_by_primary_code_ and_secondary_code (rate_plan_code, inv_type_code) odnajdzie istniejący rekord. Nowy rekord nie tylko jest oceniany w pliku 2.3.11, ale nie jest zapisywany, ponieważ nasza walidacja niepowtarzalności nie jest spełniona.

Ugh. Na razie wrócę do wersji 2.3.10.

0

Zdecydowanie musi to być, jak twierdzi Tudor Constantin, problem z wartością auth ['provider'], ponieważ wydaje się być tablicą. Czy próbowałeś wykonać wywołanie przez tę zmienną? Jaki jest wynik?

Również mam nadzieję, że wiesz, że:

Authentication.find_or_create_by_provider_and_uid ('Facebook', 'XXXXX')

nie jest taki sam jak ten:

user.authentications.find_or_create_by_provider_and_uid („Facebook”, „XXXXX”)

W pierwszym przypadku którego szukasz przez wszystkich Authentication wystąpień/wierszy, natomiast w drugim jesteś zmniejszając zakres wyszukiwania dlatego tylko wyszukuje instancje/wiersze uwierzytelniania, które należą do konkretnej instancji użytkownika.

+0

Nie. Ponownie przeczytaj post (i komentarz od użytkownika mającego ten sam problem). auth ['provider'] nie jest tablicą (oczywiście zweryfikowałem jej wartość) i była to tablica, która również nie działałaby w nieokreślonym znalezisku, ale robi to. Ponadto spójrz na kod, który wprowadziłem do konsoli, i pseudo-kod z uproszczonego przykładu, którego próbowałem. Te określają literały łańcuchowe. Zdecydowanie nie ma tam tablic! (I oczywiście znam różnicę między tymi dwoma znaleziskami, to powinno być oczywiste ze strony posta). W tym momencie jestem pewien, że jest to błąd w wersji 2.3.11 AR. –

0

Sprawdź

auth['uid']

Chyba nadchodzi puste dla ciebie. Dlatego

`authentications`.`uid` IS NULL) AND ((`authentications`.`user_id` = 10))

jest sprzeczne

Powiązane problemy