我根据railscast 350-rest-api-versioning构建rails webservice API
如果您无法访问此截屏视频,here is the github repo包含其源代码。
但我无法让它发挥作用。我在模块中定义了User
的子类,并将其用于respond_with
。我尝试时会抛出NoMethodError
。
代码如下所示:
module Api
module V1
class SessionsController < ApplicationController
respond_to :json
skip_before_filter :verify_authenticity_token
class User < ::User
def as_json(options={})
super(only: [:id, :email])
end
end
def create
user = User.authenticate(params[:email], params[:password])
if user
# render json: user_json(user), status: 201
respond_with user
else
render status: 401, json: { success: false, error_msg: 'Wrong email or password' }
end
end
end
end
end
路线:
namespace :api, defaults: {format: 'json'} do
scope module: :v1, constraints: ApiConstraints.new(version: 1, default: true) do
resources :sessions
resources :users
post 'login' => 'sessions#create', as: 'login'
end
end
当我使用正确的电子邮件和密码发布/api/login
时,它会显示
NoMethodError(未定义的方法
api_v1_sessions_controller_user_url' for #<Api::V1::SessionsController:0x007f9451f72488>): app/controllers/api/v1/sessions_controller.rb:19:in
创建&#39;
当我注释掉类User
定义时,它工作正常,但结果json将包含用户的每个实例变量,包括password
,password_hash
等。
我尝试将类定义从SessionsController
移出模块V1,然后移动
NoMethodError(未定义的方法
api_v1_user_url' for #<Api::V1::SessionsController:0x007f94534e6788>): app/controllers/api/v1/sessions_controller.rb:18:in
创建&#39;
被抛出。这很奇怪,因为我几乎完全像Ryan在截屏视频中所做的那样。