在Devise/Rails 4中,Api::PostsController出现undefined method 'authenticate_user!'错误

8

我的项目中有以下路由:

  root 'home#index'

  namespace :api, defaults: { format: :json } do
    devise_for :users, controllers: { sessions: "api/sessions" }
    resources :posts
  end

用户模型:

class User < ActiveRecord::Base
    has_many :posts,        dependent: :destroy
    has_many :comments, dependent: :destroy

    validates :name, presence: true

    devise :database_authenticatable, :rememberable
end

会话控制器:

class Api::SessionsController < Devise::SessionsController
  def create
    @user = User.find_for_database_authentication(email: params[:user][:email])
    if @user && @user.valid_password?(params[:user][:password])
        sign_in(@user)
    else
        warden.custom_failure!
      @errors = [ 'Invalid email or password' ]
        render 'api/shared/errors', status: :unauthorized
    end
    end
end

应用程序控制器:

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  #protect_from_forgery with: :exception
end

最后是我的帖子控制器:
class Api::PostsController < ApplicationController
    before_action :authenticate_user!, only: [ :create ]

    def create
      current_user.posts.create!(post_params)
    end

    private

        def post_params
            params.require(:post).permit(:title, :content)
        end
end

但是,当我尝试创建一个新的帖子时,出现了以下错误:“undefined method `authenticate_user! Api::PostsController”。如果我删除它,就会出现关于“current_user”方法的错误。问题出在哪里?我该如何解决?提前致谢!

2个回答

12

你得到那个错误是因为将 devise 嵌套在 :api 命名空间中,在你的 routes.rb 文件中。因此,你应该按照以下方式验证用户:

class Api::PostsController < ApplicationController
    before_action :authenticate_api_user!, only: [ :create ]
end

1
这是一个非常奇怪的模式! - mekdigital

4

我曾经使用devise遇到类似的问题。 问题是我用了一个不同于user的名称来命名我的数据库(我用了xuser)。 在我的情况下,我只需要在我的控制器中重命名变量。 就像这样

before_action :authenticate_xuser!, only: [ :create ]

def create
    current_xuser.posts.create!(post_params)
end

private

def post_params
       params.require(:post).permit(:title, :content)
end

希望这能帮到你!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接