我正在try 为iphone应用程序构建rails API.Desive可以很好地通过web界面进行登录,但我需要能够使用RESTAPI创建和销毁会话,并且我希望使用JSON,而不必在会话控制器上发布帖子,解析HTML并处理重定向.

我想我可以这样做:

class Api::V1::SessionsController < Devise::SessionsController  
  def create
    super
  end  
  def destroy
    super
  end  
end

在配置/路由中.我补充说:

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/sessions时,一切正常.我有一些HTML和302.

现在,如果我发布到/api/v1/sessions,我会得到:

未知行为

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'}}"

推荐答案

这就是最终奏效的方法.

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  

还要改变路由.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

Ruby-on-rails相关问答推荐

使用turbo流的部分渲染在rails 7中不起作用.

为什么这个rails Collection_select不呈现关联属性?

如何通过graphqlMutations 从rails销毁当前用户会话

Rails 7 共享刺激控制器功能

为什么总是有东西在我的 mac 上的 5000 端口运行

在 Ruby on Rails html.erb 文件中循环

Rails 3 应用程序的 MySQL 集群 (NDB) 与 MySQL 复制 (InnoDB):优点/缺点?

如何从设计中删除/禁用注册

在 Rails 3.2 中更新多行

从 Rails 生成 PDF

使用 Ruby on Rails 从原始 IP 地址获取用户国家名称

Rails 助手应该假设实例变量存在还是应该将它们作为参数接收?

Ruby on Rails 错误无法加载此类文件 - 更少

rails structure.sql和schema.rb有什么区别

如何在 Ruby on Rails 的内存缓存存储中列出键?

用户注册时设计确认令牌无效

在 Rails 中,在特定时区创建特定时间(不是现在)的最佳方式是什么?

您将如何解析 Ruby 中的 url 以获取主域?

find、where 和 find_by_id 有什么区别?

将数组传递到 hidden_​​field ROR