2012-01-12 10 views
7

Pracuję nad integracją mojej aplikacji Rails 3.1 z uruchomioną wersją Devise w celu uwierzytelnienia użytkownika w mojej aplikacji na iOS. Chciałbym, aby użytkownik mógł się zarejestrować z poziomu aplikacji, a następnie mogę zapisać te dane logowania, aby zalogować się później.Utwórz użytkownika w programie Devise z JSON

Korzystanie RestKit, mogę to zrobić:

-(IBAction)registerUser:(id)sender { 
    NSDictionary *params = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects: 
                   self.email.text, 
                   self.password.text, 
                   self.confirmPassword.text, 
                   nil] 
                 forKeys:[NSArray arrayWithObjects: 
                   @"email", 
                   @"password", 
                   @"password_confirmation", 
                   nil]]; 

    [[RKClient sharedClient] post:@"/users.json" params:params delegate:self]; 
} 

/users.json url idzie: user_registration POST /users(.:format) {:action=>"create", :controller=>"devise/registrations"} (według tras kasę). Wygląda na to, że połączenie post akceptuje różne formaty, więc zakładam, że zaakceptuje JSON. Żądanie Mojej poczty jest serializowane jako JSON i wysyłane. Serwer otrzymuje go i jest to dziennik:

Started POST "/users.json" for 129.21.84.10 at 2012-01-12 15:33:57 -0500 
    Processing by Devise::RegistrationsController#create as JSON 
    Parameters: {"password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "email"=>"[email protected]"} 
WARNING: Can't verify CSRF token authenticity 
    User Load (0.9ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1 
    (0.3ms) BEGIN 
    (0.2ms) COMMIT 
    (0.2ms) BEGIN 
    (0.4ms) ROLLBACK 
Completed 422 Unprocessable Entity in 93ms (Views: 3.8ms | ActiveRecord: 10.2ms) 

Otrzymuję błąd 422, a mój użytkownik nie jest tworzony. Odpowiedź otrzymywana przez moją aplikację na iOS to: Response: {"email":["can't be blank"],"password":["can't be blank"]}. Ale hasło i adres e-mail nie są puste, serwer je pomyślnie. Tak więc coś nie działa poprawnie i nie jestem pewien, gdzie się udać. Jak mogę utworzyć użytkownika za pomocą JSON?

Dzięki za pomoc!

+0

Czy zdarzyło Ci się, że to działa? – Quentamia

+0

Nie, ale ruszyłem dalej bez potrzeby działania. Być może będę go potrzebować w przyszłości ... –

Odpowiedz

5

Twoja aplikacja szyny spodziewa JSON w tej formie:

{"user":{"email":"[email protected]", "password":"Test123", "password_confirmation":"Test123"}} 

ale domyślnie RestKit wysyła to:

{"email":"[email protected]", "password":"Test123", "password_confirmation":"Test123"} 

Aby dodać "user" wystarczy ustawić rootKeyPath takiego :

RKObjectMapping *userSerializationMapping = [userMapping inverseMapping]; 
userSerializationMapping.rootKeyPath = @"user"; 
[[RKObjectManager sharedManager].mappingProvider setSerializationMapping:userSerializationMapping forClass:[User class]]; 
5

Sam pracuję nad tym samym - tworzenie użytkowników w Devise z aplikacji na iPhone'a. Mam to działa uczta zamieszczając json, który wygląda tak:

{"user":{"email":"[email protected]", "password":"Test123", "password_confirmation":"Test123"}} 

i adresem:

http://localhost:3000/users.json

i żądanie nagłówek Content-Type z mojego postu to „application/json ".

Wszystkie standardowe konfiguracje Devise.

+2

Otrzymuję kod błędu 406 tutaj. – quantumpotato

+1

@quantumpotato dziwne! Czy próbowałeś [this] (http://stackoverflow.com/questions/3751030/rails-3-returning-a-http-406-not-acceptable) –

+3

@quantumpotato Devise rzuca 406, ponieważ akceptuje tylko HTML jako v 2.2. Musisz jawnie ustawić go tak, aby akceptował JSON, jak pokazano tutaj: https://github.com/plataformatec/devise/wiki/How-To:-Ugrade-to-Devise-2.2 – jesal

Powiązane problemy