我正在尝试为iphone应用程序构建一个rails API。Devise适用于通过web界面登录,但我需要能够使用REST API创建和销毁会话,并且我希望使用JSON,而不必在会话控制器上执行POST,还必须解析HTML并处理重定向。
我想我可以这样做:
class Api::V1::SessionsController < Devise::SessionsController
def create
super
end
def destroy
super
end
end
在config/routes.rb中,我添加了:
namespace :api do
namespace :v1 do
resources :sessions, :only => [:create, :destroy]
end
end
rake routes显示路由设置正确:
api_v1_sessions POST /api/v1/sessions(.:format) {:action=>"create", :controller=>"api/v1/sessions"}
api_v1_session DELETE /api/v1/sessions/:id(.:format) {:action=>"destroy", :controller=>"api/v1/sessions"}
当我发布到/user/session时,一切都很正常。我得到了一些HTML和一个302。
现在,如果我发布到/api/v1/session,我会得到:
未知操作AbstractController::ActionNotFound
curl -v -H 'Content-Type: application/json' -H 'Accept: application/json' -X POST http://localhost:3000/api/v1/sessions -d "{'user' : { 'login' : 'test', 'password' : 'foobar'}}"
发布于 2011-02-12 08:31:21
这就是最终奏效的方法。
class Api::V1::SessionsController < Devise::SessionsController
def create
respond_to do |format|
format.html { super }
format.json {
warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new")
render :status => 200, :json => { :error => "Success" }
}
end
end
def destroy
super
end
end
还要更改routes.rb,记住顺序很重要。
devise_for :users, :controllers => { :sessions => "api/v1/sessions" }
devise_scope :user do
namespace :api do
namespace :v1 do
resources :sessions, :only => [:create, :destroy]
end
end
end
resources :users
发布于 2012-02-06 07:29:54
我最终使用了@akshay的答案和@mm2001的答案的组合。
class Api::SessionsController < Devise::SessionsController
def create
warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#failure")
render :json => {:success => true}
end
def destroy
Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name)
render :json => {}
end
def failure
render :json => {:success => false, :errors => ["Login Failed"]}
end
end
..。在devise初始化器中,我必须这样做才能让#create方法使用我的:recall
处理程序
# config/initializers/devise.rb
config.navigational_formats = [:"*/*", "*/*", :html, :json]
这是Devise 1.5.1和Rails 3.1的版本。
发布于 2011-06-07 09:25:11
这里有一个最新的答案:http://jessehowarth.com/devise有更多的细节(根据Using Devise 1.3 to authenticate JSON login requests)
https://stackoverflow.com/questions/4857855
复制相似问题