Are*_*rel 0 api ruby-on-rails devise uninitialized-constant
我正在编写API并尝试使用API登录并收到uninitialized constant SessionsController错误,然后提示"尝试运行rake路由以获取有关可用路由的更多信息".当我尝试转到URL时
http://localhost:3000/api/v1/login 作为一个 POST
我的路线显示路线和行动如图所示:
api_v1_users GET /api/v1/users(.:format) api/v1/users#index {:format=>"json"}
POST /api/v1/users(.:format) api/v1/users#create {:format=>"json"}
new_api_v1_user GET /api/v1/users/new(.:format) api/v1/users#new {:format=>"json"}
edit_api_v1_user GET /api/v1/users/:id/edit(.:format) api/v1/users#edit {:format=>"json"}
api_v1_user GET /api/v1/users/:id(.:format) api/v1/users#show {:format=>"json"}
PUT /api/v1/users/:id(.:format) api/v1/users#update {:format=>"json"}
DELETE /api/v1/users/:id(.:format) api/v1/users#destroy {:format=>"json"}
new_api_v1_user_session GET /api/v1/login(.:format) sessions#new {:format=>"json"}
api_v1_user_session POST /api/v1/login(.:format) sessions#create {:format=>"json"}
destroy_api_v1_user_session DELETE /api/v1/logout(.:format) sessions#destroy {:format=>"json"}
api_v1_user_omniauth_authorize GET|POST /auth/:provider(.:format) authentications#passthru {:provider=>/twitter|facebook/, :format=>"json"}
api_v1_user_omniauth_callback GET|POST /auth/:action/callback(.:format) authentications#(?-mix:twitter|facebook) {:format=>"json"}
api_v1_user_password POST /api/v1/password(.:format) api/v1/passwords#create {:format=>"json"}
new_api_v1_user_password GET /api/v1/password/new(.:format) api/v1/passwords#new {:format=>"json"}
edit_api_v1_user_password GET /api/v1/password/edit(.:format) api/v1/passwords#edit {:format=>"json"}
PUT /api/v1/password(.:format) api/v1/passwords#update {:format=>"json"}
cancel_api_v1_user_registration GET /api/v1/cancel(.:format) registrations#cancel {:format=>"json"}
api_v1_user_registration POST /api/v1(.:format) registrations#create {:format=>"json"}
new_api_v1_user_registration GET /api/v1/sign_up(.:format) registrations#new {:format=>"json"}
edit_api_v1_user_registration GET /api/v1/edit(.:format) registrations#edit {:format=>"json"}
PUT /api/v1(.:format) registrations#update {:format=>"json"}
DELETE /api/v1(.:format) registrations#destroy {:format=>"json"}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用authentication_tokenurl参数访问帐户时,它工作正常.
http://localhost:3000/api/v1/users/39?user_token=DxwspVzYSpsiLosd9xcE
使用它我可以做PUT和GET请求没有问题.
我的路线看起来像这样:
namespace :api, defaults: {format: 'json'} do
namespace :v1 do
resources :users
devise_for :users, :path => '', path_names: {sign_in: "login", sign_out: "logout"},
controllers: {omniauth_callbacks: "authentications", registrations: "registrations", sessions: "sessions"}
end
end
Run Code Online (Sandbox Code Playgroud)
我认为这是我的SessionsController中的一个问题,但无法弄清楚为什么PUT请求会起作用,但POST不会.这是SessionsController:
module Api
module V1
class SessionsController < Devise::SessionsController
before_filter :authenticate_user!, except: [:create, :destroy]
before_filter :ensure_params_exist
skip_before_filter :verify_authenticity_token
def create
resource = User.find_for_database_authentication(email: params[:user_login][:email])
return invalid_login_attempt unless resource
if resource.valid_password?(params[:user_login][:password])
sign_in("user", resource)
resource.ensure_authentication_token!
render 'api/v1/sessions/new.json.jbuilder', status: 201
return
end
invalid_login_attempt
end
def destroy
current_user.reset_authentication_token
render json: {success: true}
end
protected
def ensure_params_exist
return unless params[:user_login].blank?
render json: {success: false, message: "missing user_login parameter"}, status: 422
end
def invalid_login_attempt
render 'api/v1/sessions/invalid.json.jbuilder', status: 401
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
Are*_*rel 10
所以在我的路线文件中我有
namespace :api, defaults: {format: 'json'} do
namespace :v1 do
resources :users
devise_for :users, path: '', path_names: {sign_in: "login", sign_out: "logout"},
controllers: {omniauth_callbacks: "authentications", registrations: "registrations", sessions: "sessions"}
end
end
Run Code Online (Sandbox Code Playgroud)
我删除了sessions: "sessions",一切都很好.我不打算将此标记为正确答案,因为我不知道为什么这会解决问题,或者更具体地说,为什么添加sessions: "sessions"导致错误的原因.希望有人能为未来的读者解释这一点.
编辑:
我认识很久以后,问题是,我是引用sessions_controller,当我想引用api/v1/sessoins_controller有没有正规sessions_controller的话就用设计之一,但有一个sessions_controller在API/V1命名空间.这就是问题发生的原因.
对于遇到此问题的任何其他人的未来参考,错误告诉您正在寻找的控制器不存在,因此要进行故障排除,确保您在正确的位置寻找控制器,并且用正确的名字.
| 归档时间: |
|
| 查看次数: |
9541 次 |
| 最近记录: |