使用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?
...谢谢