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?
Brzmi jak robaka. Prześlij go do projektu szyn. –