サーバーにjsonでログインしたい。create メソッドはカスタム ビュー (new.html.erb) では機能しますが、json では機能しません。私はgemデバイスを使用しています。
セッションコントローラー:
class SessionsController < ApplicationController
respond_to :json
def new
#empty because no underlying model
end
def create
user = User.find_by_email(params[:email])
respond_to do |format|
if user && user.authenticate(params[:password]) #because user has_secure_password
session[:user_id] = user.id
format.html { redirect_to images_path, notice: "Login successful!" }
format.json { render :json => {:success => true,
:info => "Logged in" } }
else
format.html { flash.now.alert = "Wrong email or password"
render "new" }
format.json { render :json => {:success => false, :info => "Wrong email or password" } }
end
end
end
def destroy
session[:user_id] = nil
respond_to do |format|
format.html { redirect_to bookmarks_path, notice: "Logout successful!" }
format.json { render :json => {:success => true,
:info => "Logged out",
:data => { } } }
end
end
end
user.rb
class User < ActiveRecord::Base
attr_accessible :name, :email, :password, :password_confirmation, :remember_me, :encrypted_password
has_secure_password
validates :email, format: /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i, uniqueness: true
end
ルート.rb:
#user
resources :users , only: [:new, :create]
#session
get "login" => "sessions#new", as: "login"
post "sessions" => "sessions#create", as: "sessions"
delete "logout" => "sessions#destroy", as: "logout"
レーキルート:
users POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
login GET /login(.:format) sessions#new
sessions POST /sessions(.:format) sessions#create
logout DELETE /logout(.:format) sessions#destroy
Chrome 拡張機能の Simple REST Client を使用して、HTTP POST 経由でサーバーをテストし、json データを使用します (ユーザーは既にデータベースに存在し、new.html.erb ビューからのログインが機能します)。
url: http://localhost:3000/sessions
method: POST
Content-Type: application/json
Accept: application/json
Data: {"user":{ "email":"test@test.at","password":"asdf" }}
応答として、ステータス 200 OK を取得しますが、次のようになります。
{"success":false,"info":"Wrong email or password"}
メールとパスワードは正しいですが。