Rails 3:为什么我的respond_to语句在从POST请求调用时抛出这个异常?


respond_to :json, :html
.
.
.
return_hash = {}
return_hash[:result] = "valid"
return_hash[:status] = "#{userName} has successfully registered for tournament #{tourneyID}"
respond_with(return_hash) #<--Throwing expection NoMethodError (undefined method `model_name' for NilClass:Class):

这是堆栈跟踪…

NoMethodError (undefined method `model_name' for NilClass:Class):
app/controllers/tournaments_controller.rb:48:in `register'
Rendered /Users/myname/.rvm/gems/ruby-1.9.2-p180/gems/actionpack-3.0.5/lib/action_dispatch/middleware/templates/rescues/_trace.erb (2.8ms)
Rendered /Users/myname/.rvm/gems/ruby-1.9.2-p180/gems/actionpack-3.0.5/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (151.8ms)
Rendered /Users/myname/.rvm/gems/ruby-1.9.2-p180/gems/actionpack-3.0.5/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (211.1ms)

非常感谢!

不确定是否重要,但我应该添加这是在响应POST请求

更新: 我有类似的代码,工作得很好,它看起来像这样…

 # Store the tourney data
 tourney_hash[:tournament_count] = 1
 tourney_hash[:tournament_id] = nextTourney.id
 tourney_hash[:remaining_time_in_seconds] = remainingTimeInSeconds   
 respond_with(tourney_hash)
唯一的区别是这段代码是从GET请求调用的,而上面有问题的代码是从POST请求调用的

更新: 当我更改此代码以便从GET请求而不是POST请求调用它时,它工作得很好。你的想法呢?

更新: 目前,我已经将语句"respond_with(return_hash)"替换为"render:json => return_hash"。To_json",它工作得很好。但这并不理想。

due to http://apidock.com/rails/ActionController/MimeResponds/respond_with

respond_with(*resources, &block) public

这意味着respond_with方法接受资源,而return_hash是一个散列,而不是一个ActiveRecord对象。所以你的代码是错误的。这是行不通的。

乌利希期刊指南

为什么这与GET工作,而不与POST, PUT或DELETE工作?

我不知道你为什么用respond_with(some_hash)这样奇怪的结构。什么是respond_with法?

respond_with将资源封装在响应器周围,用于默认表示

所以不传递资源而是传递哈希值是很奇怪的。

现在让我们来了解它是如何工作的:

# GET request
respond_with(whatever)
# same as
respond_to do |format|
  format.html{ } # will render your_action_name.html.erb
end

但是!

# POST request
respond_with(whatever)
# is same as
respond_to do |format|
  format.html{ redirect_to WHATEVER } # !!!!
end

这就是respond_with的工作原理

所以你应该传递一个资源给respond_with,而不是其他任何东西。所以你的方法是错误的。这就是为什么你会得到一个错误。因为对于redirect_to return_hash,它试图让model_name生成一个路径。

乌利希期刊指南2

要渲染json,你应该:

respond_to do |format|
  format.json{ render :json => return_hash.to_json }
end

我相信respond_with应该与ActiveRecord对象(或ActiveRecord对象的集合)一起使用,而不是散列。

相关内容

  • 没有找到相关文章

最新更新