Учебное пособие по Rails 3 Вход cURL/iOS

Я взял приложение Rails 3 Tutorial от Майкла Хартла и расширил его в нескольких областях. Тем не менее, я сохранил логин и сеанс обработки одинаковыми. Я хотел бы взаимодействовать с приложением для iphone, но не знаю, как это сделать. Я посмотрел на RestKit и Objective Resource, но подумал, что напишу свой собственный. Я тестировал это с помощью cURL, но пока не повезло. Я использовал эту команду

curl -H 'Content-Type: application/json'   -H 'Accept: application/json'   -X POST http://www.example.com/signin   -d "{'session' : { 'email' : '[email protected]', 'password' : 'pwd'}}"   -c cookie

Как и в руководстве по Rails 3, я использую Sessions.

Это маршруты:

match '/signin', :to => 'sessions#new'
match '/signout', :to => 'sessions#destroy' 

Это контроллер:

class SessionsController < ApplicationController
def new
@title = "Sign in"
end

def create
user = User.authenticate(params[:session][:email],
                         params[:session][:password])
if user.nil?
    flash.now[:error] = "Invalid email/password combination."
    @title = "Sign in"
    render 'new'
else
    sign_in user
    redirect_back_or user
end
end

def destroy
sign_out
redirect_to root_path
end
end 

Модели нет, и вы входите с помощью формы. Вот html для формы:

<h1>Sign In</h1>
<%= form_for(:session, :url => sessions_path) do |f| %>
<div class="field">
<%= f.label :email %></br>
<%= f.text_field :email %>
</div>
<div class="field">
<%= f.label :password %></br>
<%= f.password_field :password %>
</div>
<div class="actions">
<%= f.submit "Sign in" %>
</div>
<% end %>

<p> New user? <%= link_to "Sign up now!", signup_path %></p> 

Извините, если это слишком много информации, я хотел дать как можно больше.

По сути, я хотел бы иметь доступ к моей базе данных Rails из собственного приложения для iphone. Если у кого-то есть хороший совет о том, как войти в систему, сохранить сеанс, а затем сделать другие звонки на веб-сайт, я был бы очень признателен.

Однако, если это невозможно, рабочий запрос cURL, вероятно, поможет мне двигаться в правильном направлении. Спасибо!


person NSchulze    schedule 01.08.2012    source источник


Ответы (1)


Я столкнулся с похожей ситуацией, что привело меня к написанию этого поста stackoverflow:

[http://stackoverflow.com/questions/7997009/rails-3-basic-http-authentication-vs-authentication-token-with-iphone][1]

По сути, вы можете использовать базовую HTTP-аутентификацию с рельсами, чтобы упростить задачу.

Вот пример контроллера:

 class PagesController < ApplicationController  

  def login
    respond_to do |format|
      format.json {
        if params[:user] and
           params[:user][:email] and
           params[:user][:password]
          @user = User.find_by_email(params[:user][:email])
          if @user.valid_password?(params[:user][:password])
            @user.ensure_authentication_token!
            respond_to do |format|
              format.json {
                render :json => {
                    :success => true,
                    :user_id => @user.id,
                    :email => @user.email
                  }.to_json
              }
            end
          else
            render :json => {:error => "Invalid login email/password.", :status => 401}.to_json
          end
        else
          render :json => {:error => "Please include email and password parameters.", :status => 401}.to_json
        end
      }
    end
  end

Затем на стороне iphone/objective-c вы можете использовать библиотеку ASIHTTPRequest и библиотеку JSONKit:

http://allseeing-i.com/ASIHTTPRequest/

https://github.com/johnezang/JSONKit/

После того, как вы установили все вышеупомянутое в xcode, получить доступ к контроллеру rails, получить ответ в виде json и обработать его в target-c очень просто:

NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@/pages/login.json", RemoteUrl]];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request addRequestHeader:@"Content-Type" value:@"application/json"];
[request setRequestMethod:@"POST"];
[request appendPostData:[[NSString stringWithFormat:@"{\"user\":{\"email\":\"%@\", \"password\":\"%@\"}}", self.emailField.text, self.passwordField.text] dataUsingEncoding:NSUTF8StringEncoding] ];
[request startSynchronous];

//start
[self.loginIndicator startAnimating];

//finish
 NSError *error = [request error];
[self setLoginStatus:@"" isLoading:NO];

if (error) {
    [self setLoginStatus:@"Error" isLoading:NO];
    [self showAlert:[error description]];
} else {
    NSString *response = [request responseString];

    NSDictionary * resultsDictionary = [response objectFromJSONString];


    NSString * success = [resultsDictionary objectForKey:@"success"];


    if ([success boolValue]) {
        ....

Я только что закончил приложение для Rails/iPhone с кучей обращений к Rails, так что это определенно выполнимо и полезно для обучения.

person JohnMerlino    schedule 01.08.2012
comment
Это может быть глупый вопрос, но я все еще относительно новичок в Rails. Что именно делает format.json? Позволяет ли это мне отправлять параметры в формате JSON? Если мой if format.js прямо сейчас, не испортит ли его изменение на format.json что-нибудь? - person NSchulze; 01.08.2012
comment
Да, он отправляет параметры в формате JSON. Json — это подмножество JavaScript, хотя не все ответы JavaScript являются ответами json. Json читается javascript, и это быстрый и эффективный способ передачи данных с сервера на javascript. - person JohnMerlino; 01.08.2012
comment
Прохладный. Так почему моя команда cURL не работала, потому что это был format.js? Или я далеко от базы там? - person NSchulze; 02.08.2012
comment
При использовании curl обязательно добавьте заголовки: curl -H 'Content-Type: application/json' \ › -H 'Accept: application/json' \ › -X POST localhost:3000/users/sign_in \ › -d '{remote: true, commit: Sign in, utf8: ✓, user: {remember_me: 1, пароль: 123456, электронная почта: [email protected]}}' - person JohnMerlino; 02.08.2012
comment
Я обязательно буду. У меня просто проблемы с работой. Не могли бы вы мне объяснить, что именно заставляет контроллер реагировать на сообщение в формате JSON? Я думаю, что это то место, где я зацикливаюсь. Спасибо! - person NSchulze; 10.08.2012