2011-04-25 34 views
4
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): 

這裏的堆棧跟蹤...Rails 3:爲什麼從POST請求調用時,我的respond_to語句會拋出此異常?

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請求調用時,它工作正常。你的想法?

UPDATE: 暫且,我把它換成聲明 「respond_with(return_hash)」 和 「渲染:JSON => return_hash.to_json」,它工作正常。不理想,壽。

+0

爲了好奇的緣故,如果使用實例變量,它是否也會這樣做? – apneadiving 2011-04-25 17:23:14

+0

是的,它的確如此。當我嘗試,並與存儲在它的10的值返回一個臨時實例變種,我得到這個例外,「NoMethodError(未定義的方法'模型名稱」的Fixnum對象:類): 應用程序/控制器/ tournaments_controller.rb:50:在'註冊」「 – BeachRunnerFred 2011-04-25 17:28:27

+0

你如何定義'model_name'和'userName' – apneadiving 2011-04-25 17:31:59

回答

9

由於http://apidock.com/rails/ActionController/MimeResponds/respond_with

respond_with(*資源,&塊)的公共

這意味着respond_with方法接受資源(多個)而return_hash是哈希,而不是一個ActiveRecord對象。所以你的代碼是錯誤的。它永遠不會工作。

UPD

爲什麼用得到這個工作,不與崗位工作,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 

BUT!

# 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生成一個路徑。

就是這樣。

UPD 2

要渲染JSON你應該:

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

自己嘗試,它的工作即使不是資源加載ActiveModel我 – apneadiving 2011-04-25 17:51:42

+0

有非常相似的代碼它使用respond_with返回一個散列,它工作的很好,請看我上面更新的問題。謝謝! – BeachRunnerFred 2011-04-25 17:55:15

+0

有趣。嗯 – fl00r 2011-04-25 17:55:38

1

我相信respond_with應該有一個ActiveRecord對象(或ActiveRecord對象的集合)中使用,而不是一個哈希值。

+0

我有非常相似的代碼,使用respond_with返回一個散列,它工作的很好,請看我上面更新的問題。謝謝! – BeachRunnerFred 2011-04-25 17:55:03

+0

我剛剛更新了我的問題,提到代碼在響應GET請求而不是POST請求時執行時正常工作。你的想法? – BeachRunnerFred 2011-04-25 18:20:58

相關問題