尝试测试HTTParty Post时遇到NoMethodError(未定义的方法`gsub'对于nil:NilClass)

时间:2014-07-11 19:59:57

标签: ruby-on-rails api authentication mongoid httparty

使用HTTParty测试帖子时遇到以下错误:

NoMethodError (undefined method `gsub' for nil:NilClass):
  app/models/user.rb:44:in `authorized_domain_referer?'
  app/controllers/api/v1/events_controller.rb:17:in `create'

当我在rails控制台中运行以下内容时:

HTTParty.post("http://localhost:3000/api/v1/events.json", body: {auth_token: User.last.authentication_token}, headers: {"HTTP_REFERER" => "http://one.com"}).parsed_response

这很奇怪,因为当我刚运行User.last.authentication_token时,我得到与用户关联的令牌:

User.last.authentication_token
 => "eb7bba8f1fc297a4f16a198b153015217c4ade87610e7aec78a36f0f0c33" 

这是错误之前的完整输出:

  Started POST "/api/v1/events.json" for 127.0.0.1 at 2014-07-11 16:01:53 -0400
Processing by Api::V1::EventsController#create as JSON
  Parameters: {"auth_token"=>"eb7bba8f1fc297a4f16a198b153015217c4ade87610e7aec78a36f0f0c33"}
  MOPED: 127.0.0.1:27017 QUERY        database=trackmetrics_development collection=users selector={"$query"=>{"authentication_token"=>"eb7bba8f1fc297a4f16a198b153015217c4ade87610e7aec78a36f0f0c33"}, "$orderby"=>{:_id=>-1}} flags=[] limit=-1 skip=0 batch_size=nil fields=nil runtime: 0.7350ms
#<User _id: 53bbdffc5368616e4b020000, name: "elad meidar", email: "elad@shinobidevs.com", encrypted_password: "$2a$10$EaQLyTACVrY6psdKGPeK9ODdSZSOOrZtNsS8r8.553MBoRyGxM8Bi", authentication_token: "eb7bba8f1fc297a4f16a198b153015217c4ade87610e7aec78a36f0f0c33", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 27, current_sign_in_at: 2014-07-11 20:01:45 UTC, last_sign_in_at: 2014-07-11 19:49:03 UTC, current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", confirmation_token: nil, confirmed_at: 2014-07-08 12:12:07 UTC, confirmation_sent_at: 2014-07-08 12:11:40 UTC, unconfirmed_email: nil>
  MOPED: 127.0.0.1:27017 UPDATE       database=trackmetrics_development collection=users selector={"_id"=>BSON::ObjectId('53bbdffc5368616e4b020000')} update={"$set"=>{"last_sign_in_at"=>2014-07-11 20:01:45 UTC, "current_sign_in_at"=>2014-07-11 20:01:53 UTC, "sign_in_count"=>28}} flags=[]
                         COMMAND      database=trackmetrics_development command={:getlasterror=>1, :w=>1} runtime: 0.5950ms
Completed 500 Internal Server Error in 4ms

NoMethodError (undefined method `gsub' for nil:NilClass):
  app/models/user.rb:44:in `authorized_domain_referer?'
  app/controllers/api/v1/events_controller.rb:17:in `create'


  Rendered /Users/shaunkoo/.rvm/gems/ruby-2.0.0-p353/gems/actionpack-4.0.2/lib/action_dispatch/middleware/templates/rescues/_source.erb (0.7ms)
  Rendered /Users/shaunkoo/.rvm/gems/ruby-2.0.0-p353/gems/actionpack-4.0.2/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.1ms)
  Rendered /Users/shaunkoo/.rvm/gems/ruby-2.0.0-p353/gems/actionpack-4.0.2/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.0ms)
  Rendered /Users/shaunkoo/.rvm/gems/ruby-2.0.0-p353/gems/actionpack-4.0.2/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (15.5ms)

我的authorized_domain_referer? class是以下,它存储在我的用户模型中:

before_create :set_authentication_token

  def authorized_domain_referer?(request_origin)
    encoded_url = URI.encode(request_origin)
    uri = URI.parse(encoded_url)
    domain_name = "#{uri.scheme}://#{uri.host}"
    self.domains.where(url: domain_name).any?
  end

我的base_controller如下:

class Api::BaseController < ApplicationController

  respond_to :json, :xml

  skip_before_filter :verify_authenticity_token

  before_filter :authenticate_from_user_token!
  before_filter :authenticate_user!

  before_filter :cors_preflight_check
  after_filter :set_headers

  def authenticate_from_user_token!
    token = params[:auth_token]
    user = User.where(authentication_token: token).first
    if user
      sign_in user, store: false
    end
  end

即使用户经过适当的身份验证并登录,任何人都知道为什么它会成为Nilclass?

...谢谢

0 个答案:

没有答案