Bea*_*red 4 ruby-on-rails ruby-on-rails-3
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):
Run Code Online (Sandbox Code Playgroud)
这是堆栈跟踪......
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)
Run Code Online (Sandbox Code Playgroud)
非常感谢!
不确定是否重要,但我应该添加这个以响应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)
Run Code Online (Sandbox Code Playgroud)
唯一的区别是这个代码是从GET请求调用的,而上面有问题的代码是从POST请求调用的
更新: 当我更改此代码以便从GET请求而不是POST请求调用它时,它可以正常工作.你的意见?
更新: 目前,我已经用"render:json => return_hash.to_json"替换了"respond_with(return_hash)"语句,它运行正常.不太理想.
由于http://apidock.com/rails/ActionController/MimeResponds/respond_with
respond_with(*resources,&block)public
这意味着该respond_with方法接受资源return_hash,而是哈希,而不是ActiveRecord对象.所以你的代码是错误的.它永远不会奏效.
UPD
为什么这与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
Run Code Online (Sandbox Code Playgroud)
但!
# POST request
respond_with(whatever)
# is same as
respond_to do |format|
format.html{ redirect_to WHATEVER } # !!!!
end
Run Code Online (Sandbox Code Playgroud)
这是respond_with有效的
所以你应该传递一个资源,respond_with而不是其他任何东西.所以你的方法是错的.这就是为什么你有一个错误.因为redirect_to return_hash它试图让它model_name生成一个路径.
而已.
UPD 2
要渲染json,你应该:
respond_to do |format|
format.json{ render :json => return_hash.to_json }
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2753 次 |
| 最近记录: |