2013-01-21 94 views
2

我有一个使用设计的用户一个非常基本的Rails应用程序注册,登录等。我想揭露设计到iOS应用程序。有很多线程是高层次的解释,但我对Rails很陌生。我基本上张贴到用户的请求/ sign_up像这样:使用设计注册,登录和注销与iOS应用

AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://localhost:5000"]]; 
//[client defaultValueForHeader:@"Accept"]; 
[client setParameterEncoding:AFJSONParameterEncoding]; 
NSDictionary *params = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects: 
                  @"[email protected]", 
                  @"testtest", 
                  @"testtest", 
                  nil] 
                forKeys:[NSArray arrayWithObjects: 
                  @"email", 
                  @"password", 
                  @"password_confirmation", 
                  nil]]; 

[client registerHTTPOperationClass:[AFHTTPRequestOperation class]]; 
NSURLRequest *request = [client requestWithMethod:@"GET" path:@"https://stackoverflow.com/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"; 
} 

而且在铁轨上侧:

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"=>"[email protected]"} 
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的是,我不希望呈现的任何意见。我只是想通过注册或登录凭据为JSON对象,并接收用户创建或登录验证。上面我所,因为它试图渲染视图不创建用户。任何帮助将不胜感激。谢谢。

+0

您可以发布从Rails的您的注册方法是什么?有2个部分,iOS应用程序请求JSON,Rails响应。 – MishieMoo

+0

这就是我卡住的地方。这是Devise安装的开箱即用型号/视图/控制器。 –

+0

我在说你的实际控制器代码(而不是视图)。不是每个人都会记住Devise为您提供的开箱即用功能。有机会你只需要编辑一个'respond_to'。 – MishieMoo

回答

4

我在做类似的事情,并有注册它使用JSON(这应该转化到iOS容易)迄今通过工作卷曲部分,也可通过浏览器。从NeverBe使用的this answer变形例:

我改性配置/初始化/ devise.rb和添加的行:

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

我改性配置/ routes.rb中和替换这line:

devise_for :users 

with this line:

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

我创建了一个新的文件应用程序/控制器/ 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 

附加说明:您仍然得到错误,而不所有自定义错误处理代码甚至处理,但我想返回状态代码中的错误(400和409),而不是200自定义错误消息这是我从默认色器件行为得到。