Sessions Api,未定义方法downcase

时间:2014-08-29 22:02:44

标签: ruby ruby-on-rails-3 api session login

我已经开始为我的rails应用程序创建一个Api。我目前正在创建用于登录的会话控制器。

但出于某种原因我收到了这个错误

NoMethodError
in Api::V1::SessionsController#create

undefined method `downcase' for nil:NilClass;

我不明白为什么会这样。我也在传统的会话控制器中使用downcase方法,我没有这个问题。

API CONTROLLER

module Api
  module V1
    class SessionsController < ApplicationController
      skip_before_filter :verify_authenticity_token,
                       :if => Proc.new { |c| c.request.format == 'application/json' }

      respond_to :json

      def create 
        user = User.find_by_email(params[:session][:email].downcase)
        if user && user.authenticate(params[:session][:password])
          sign_in user
        end
        render :status => 200,
           :json => { :success => true,
                      :info => "Logged In Successfully",
                      :data => {  } }
      end

    end
  end
end

CONTROLLER

class SessionsController < ApplicationController

  def create
    user = User.find_by_email(params[:session][:email].downcase) ###THIS WORKS FINE
    if user && user.authenticate(params[:session][:password])
      sign_in user
      redirect_to publishers_path
    end
  end

end

路线

# API Routes

namespace :api, defaults: {format: 'json'} do
  scope module: :v1, constraints: ApiConstraints.new(version: 1, default: true) do
    resources :sessions, only: [:new, :create, :destroy]
  end
end

1 个答案:

答案 0 :(得分:1)

问题在于您检查params[:session][:email]

但是通过卷曲调用:

curl -v -H 'Content-Type: application/json' -H 'Accept: application/json' -X POST localhost:3000/api/sessions -d "{\"user\":{\"email\":\"secret@gmail.com\",\"password\":\"secret\"}}"

电子邮件仍会存储在params[:user][:email]

此外,您应该检查用户是否将该参数传递给您是api,因为您已经注意到没有它就会失败。

user = User.find_by_email(params[:user][:email].downcase) if defined? params[:user][:email]