我正在尝试在 Controllers 文件夹中为我的 rails 应用程序创建一个 api 我创建了以下文件夹结构
控制器 > api > v1
我的路线看起来像这样需要'api_constraints'
MyApp::Application.routes.draw do
devise_for :users
resources :users
......
other resources and matching for the standard application
......
# Api definition
namespace :api, defaults: { format: :json },constraints: { subdomain: 'api' }, path: '/' do
scope module: :v1,constraints: ApiConstraints.new(version: 1, default: true) do
resources :sessions, :only => [:create]
resources :users, :only => [:show]
end
end
end
我在会话和用户控制器中都遇到了同样的错误。我将只发布用户控制器,因为它更短
class Api::V1::UsersController < ApiController
respond_to :json
def show
respond_with User.find(params[:id])
end
end
然后我的测试是
require 'spec_helper'
describe Api::V1::UsersController do
describe "GET #show" do
before(:each) do
@user = FactoryGirl.create :user
get :show, id: @user.id, format: :json
end
it "returns the information about a reporter on a hash" do
user_response = JSON.parse(response.body, symbolize_names: true)
expect(user_response[:email]).to eql @user.email
end
it { should respond_with 200 }
end
end
测试的输出是
4) Api::V1::UsersController GET #show Failure/Error: get :show, id: @user.id, format: :json ArgumentError: 错误数量的参数(0 代表 1)
两个问题是 1)由于某种原因,id 没有被发送到 api 操作 2)我不确定如何访问 api。我以为应该是 api.localhost:3000/users/1
提前感谢您的帮助
更新 这是 rake 路由的输出
api_sessions POST /sessions(.:format) api/v1/sessions#create {:format=>:json, :subdomain=>"api"}
api_user GET /users/:id(.:format) api/v1/users#show {:format=>:json, :subdomain=>"api"}
更新 2创建我的用户时, 这看起来像是 参数数量错误(0 表示 1)的重复
不幸的是,这篇文章的解决方案对我来说不是一个选择。我无法删除 Devise,因为 User 模型在标准 Web rails 应用程序和应用程序的 api 部分中共享
更新 3 我一直在寻找其他使用标准应用程序使用 API 的方法,并且将设计与门卫一起使用似乎比令牌身份验证更好。设置好后,我又回到了相同的情况
参数数量错误(0 代表 1)
在服务器输出中,我看到以下输出。这是一个有效的用户 ID。
Started GET "/api/v1/users/1" for ::1 at 2015-07-27 20:52:09 +0100
Processing by Api::V1::UsersController#show as */*
Parameters: {"id"=>"1"}
Geokit is using the domain: localhost
User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 1]]
Completed 500 Internal Server Error in 21ms
ArgumentError (wrong number of arguments (0 for 1)): app/controllers/api/v1/users_controller.rb:5:in `show'
使用无效的 id 我得到这个输出
Started GET "/api/v1/users/134" for ::1 at 2015-07-27 20:55:36 +0100
Processing by Api::V1::UsersController#show as */*
Parameters: {"id"=>"134"}
Geokit is using the domain: localhost
User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 134]]
Completed 500 Internal Server Error in 6ms
NoMethodError (undefined method `api_error' for
#<Api::V1::UsersController:0x007fc5a17bf098>): app/controllers/api_controller.rb:23:in `not_found'
更新 4 插入一些调试语句后,ID 被传递给控制器操作,并且正在从数据库中检索用户。
问题在于
respond_with User.find(params[:id])
rails 无法序列化用户。我尝试用另一个没有启用设计的模型替换用户,它可以序列化模型。我不确定为什么设计会在这里引起问题。