使用Devise注册,login并注销iOS应用程序

我有一个非常基本的Rails应用程序,使用devise用户注册,login等。我想暴露Devise到iOS应用程序。 有很multithreading是高层次的解释,但我对Rails很新。 我基本上发布一个请求给用户/ sign_up像这样:

AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://localhost:5000"]]; //[client defaultValueForHeader:@"Accept"]; [client setParameterEncoding:AFJSONParameterEncoding]; NSDictionary *params = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects: @"first.last@gmail.com", @"testtest", @"testtest", nil] forKeys:[NSArray arrayWithObjects: @"email", @"password", @"password_confirmation", nil]]; [client registerHTTPOperationClass:[AFHTTPRequestOperation class]]; NSURLRequest *request = [client requestWithMethod:@"GET" path:@"/users/sign_up" parameters:params]; AFHTTPRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { NSLog(@"%@", JSON); NSLog(@"%@", [response allHeaderFields]); } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { }]; [operation setAcceptableContentTypes:[NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/plain",@"text/html", nil]]; [operation start]; 

这似乎是通过在iOS端,因为我收到200 OK:

  2013-01-21 13:38:00.412 Starfish[35773:c07] I restkit.network:RKHTTPRequestOperation.m:152 GET 'http://localhost:5000/signup?password=testtest&password_confirmation=testtest&email=first.last%40gmail.com' 2013-01-21 13:38:01.073 Starfish[35773:c07] (null) 2013-01-21 13:38:01.073 Starfish[35773:7207] I restkit.network:RKHTTPRequestOperation.m:179 GET 'http://localhost:5000/signup?password=testtest&password_confirmation=testtest&email=first.last%40gmail.com' (200 OK) [0.6611 s] 2013-01-21 13:38:01.074 Starfish[35773:c07] { "Cache-Control" = "max-age=0, private, must-revalidate"; Connection = close; "Content-Type" = "text/html; charset=utf-8"; Etag = "\"5dfe88700e41a015a8f524850446e327\""; Server = "thin 1.5.0 codename Knife"; "Set-Cookie" = "_geo-photo_session=BAh7B0kiD3Nlc3Npb25faWQGOgZFRkkiJTEyZTJjMjFkZjAwZGZlMWIzMTJmNTg5ODNkNjM5OGI0BjsAVEkiEF9jc3JmX3Rva2VuBjsARkkiMTN4eUZGUzVhb1pIdXc1QlJJUnBxSFVrZmYvUDdpeGtaeklxNGhOejFOeEk9BjsARg%3D%3D--5130edc939facbe7004570141c069d40f5f7feca; path=/; HttpOnly"; "X-Request-Id" = a2480798afed4e7aca17f3f1e2d3d44d; "X-Runtime" = "0.219984"; "X-UA-Compatible" = "IE=Edge"; } 

而在Rails方面:

 Started GET "/signup?password=[FILTERED]&password_confirmation=[FILTERED]&email=first.last%40gmail.com" for 127.0.0.1 at 2013-01-21 13:38:00 -0800 13:43:15 web.1 | Processing by Devise::RegistrationsController#new as */* 13:43:15 web.1 | Parameters: {"password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "email"=>"first.last@gmail.com"} 13:43:15 web.1 | Rendered devise/shared/_links.erb (2.1ms) 13:43:15 web.1 | Rendered devise/registrations/new.html.erb within layouts/application (23.7ms) 13:43:15 web.1 | Completed 200 OK in 142ms (Views: 64.9ms | ActiveRecord: 6.9ms) 

开箱即用注册:

 <h2>Sign up</h2> <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %> <%= devise_error_messages! %> <div><%= f.label :email %><br /> <%= f.email_field :email, :autofocus => true %></div> <div><%= f.label :password %><br /> <%= f.password_field :password %></div> <div><%= f.label :password_confirmation %><br /> <%= f.password_field :password_confirmation %></div> <div><%= f.submit "Sign up" %></div> <% end %> <%= render "devise/shared/links" %> 

这个问题,我不知道Rails足以解决,是我不想要任何意见。 我只是想将注册或login凭据作为JSON对象传递,并接收用户创build或login的validation。上面的内容不是创build用户,因为它试图呈现视图。 任何帮助将不胜感激。 谢谢。

我正在做类似的事情,并通过使用JSON(它应该可以轻松地转换成iOS)通过CURL到目前为止的工作,并通过浏览器注册。 从NeverBe使用这个答案的修改:

我修改了config / initializers / devise.rb并添加了这一行:

 config.navigational_formats = ["*/*", "/", :html, :json] 

我修改config / routes.rb并replace这一行:

 devise_for :users 

用这一行:

 devise_for :users, :controllers => {:registrations => "registrations"} 

我创build了一个新的文件app / controllers / registrations_controller.rb

 class RegistrationsController < Devise::RegistrationsController def create respond_to do |format| format.html { super } format.json { if params[:user][:email].nil? render :status => 400, :json => {:message => 'User request must contain the user email.'} return elsif params[:user][:password].nil? render :status => 400, :json => {:message => 'User request must contain the user password.'} return end if params[:user][:email] duplicate_user = User.find_by_email(params[:user][:email]) unless duplicate_user.nil? render :status => 409, :json => {:message => 'Duplicate email. A user already exists with that email address.'} return end end @user = User.create(params[:user]) if @user.save render :json => {:user => @user} else render :status => 400, :json => {:message => @user.errors.full_messages} end } end end end 

附加说明:即使没有所有的自定义error handling代码,你仍然可以得到error handling,但我想返回状态代码错误(400和409),而不是200自定义错误消息,这是我从默认的devise行为。