我正试图让Sinatra应用程序的代码在Rails环境中工作。Sinatra应用程序使用ajax请求来触发Sinatra路由/控制器操作。例如,如果在javascript模型上触发新函数
new: function() {
var _this = this;
$.ajax({
url: "/gamestart",
type: "POST",
....它将触发Sinatra应用程序中的路由/控制器代码。
post "/new" do
end当我试图在Rails中工作时,我得到了一个500个内部服务器错误。在我的Rails应用程序中,new_game按钮触发对Rails路由的ajax请求,Rails路由触发控制器操作,该控制器操作使用Rails模型从数据库中获取数据。由于某些原因,在Rails中这样做似乎不是正确的方法,我想知道这是否是我得到服务器错误的原因
GET http://localhost:3000/gamestart 500 (Internal Server Error)如果可能的话,你能告诉我在下面列出的操作链中哪里出现了这个错误,以及我可以做些什么来修复它。
1单击新的游戏按钮触发器'startNewGame‘方法
'click #new_game': 'startNewGame',2游戏模型上的startNewGame方法调用方法
startNewGame: function() {
this.model.new();
},游戏模型中的新方法3向url '/gamestart‘发出一个GET请求。我也尝试了一个帖子请求。我不知道为什么要发邮件,但两者都没有用。(在最初的Sinatra应用程序中,gamestart url立即引入函数post '/gamestart‘do.)
new: function() {
var _this = this;
$.ajax({
url: "/gamestart",
type: "GET", \\\ also tried POST
success: function(response) {
var json = $.parseJSON(response);
_this.set({lost: false});
_this.set({win: false});
_this.trigger("gameStartedEvent", json);
}
})
},4 i将url定向到Rails路由器文件中的控制器操作。
match 'gamestart' => 'locations#gamestart', :via => :get注意,在原来的Sinatra应用程序中,路由和控制器操作是结合在一起的。
5 -- locations_controller.rb的游戏启动方法
def gamestart
word = Word.get_random
masquerade_word = Word.masquerade(word)
session[:word] = word
session[:incorrect_guesses] = 0
session[:chars_left] = word.size
session[:revealed_word] = masquerade_word
{:word => masquerade_word}.to_json
end6 word模型Word.rb上的get_random方法,该方法是从位置控制器调用的
def get_random
words = []
locations = Location.all (this pulls up the names of the locations from the db)
locations.each do |e|
words << e.name
end
words.sample
end错误消息
GET http://localhost:3000/gamestart 500 (Internal Server Error) jquery.js:8215
XHR finished loading: "http://localhost:3000/gamestart". jquery.js:8215
send jquery.js:8215
jQuery.extend.ajax jquery.js:7767
window.Game.Backbone.Model.extend game.js:27
window.OptionsView.Backbone.View.extend.startNewGame optionsView.js:14
jQuery.event.dispatch jquery.js:3062
elemData.handle.eventHandle注意,在原来的Sinatra应用程序中,路由和控制器操作以通常的Sinatra方式结合在一起。
post "/gamestart" do
word = Word.get_random
masquerade_word = Word.masquerade(word)
session[:word] = word
session[:incorrect_guesses] = 0
session[:chars_left] = word.size
session[:revealed_word] = masquerade_word
{:word => masquerade_word}.to_json
end更新 500错误似乎是由缺少的模板触发的。该方法在位置控制器中没有呈现任何内容。它没有视图文件。因此,我更改了控制器,使其为respond_to :json,然后在操作结束时使用respond_with,但这触发了一个406错误。
def gamestart
word = Word.get_random
masquerade_word = Word.masquerade(word)
session[:word] = word
session[:incorrect_guesses] = 0
session[:chars_left] = word.size
session[:revealed_word] = masquerade_word
{:word => masquerade_word}.to_json
end变成现在触发406错误
respond_to :json
def gamestart
word = Word.get_random
masquerade_word = Word.masquerade(word)
session[:word] = word
session[:incorrect_guesses] = 0
session[:chars_left] = word.size
session[:revealed_word] = masquerade_word
plainvariable = {:word => masquerade_word}.to_json ###changed
respond_with plainvariable ###changed
end发布于 2013-01-13 06:37:13
您说您的gamestart控制器方法由于缺少模板而导致服务器错误。如果我们看一下控制器方法:
def gamestart
#...
{:word => masquerade_word}.to_json
end我们看到它返回一个JSON字符串,但是它忽略了呈现任何东西。您不调用任何呈现或重定向方法,因此Rails ( have )假设您想要呈现gamestart视图模板;但是,您没有这样的东西,因此您会得到一个错误。
您应该呈现您的JSON,而不是返回它;更像这样:
def gamestart
#...
render :json => { :word => masquerade_word }
endhttps://stackoverflow.com/questions/14300964
复制相似问题