我正在尝试使用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中正确的方式,我想知道这是否是我收到服务器错误的原因
GET http://localhost:3000/gamestart 500 (Internal Server Error)
如果可能,您能否告诉我下面列出的行动链中的哪个位置出现错误以及我可能采取哪些措施来解决错误。
1 点击新游戏按钮触发'startNewGame'方法
'click #new_game': 'startNewGame',
2 startNewGame方法在游戏模型上调用方法
startNewGame: function() {
this.model.new();
},
3 Game模型中的新方法向url'/ gamestart'发出GET请求。我也尝试了一个帖子请求。我不知道为什么它需要一个帖子请求,但都没有奏效。 (在最初的Sinatra应用程序中,gamestart url立即进入功能帖子'/ gamestart'做...)
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 我将网址指向Rails路由器文件中的控制器操作
match 'gamestart' => 'locations#gamestart', :via => :get
请注意,在最初的Sinatra应用程序中,路由和控制器操作已合并
5 locations_controller.rb的gamestart方法
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
6 单词模型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
答案 0 :(得分:4)
您说由于缺少模板,您的gamestart
控制器方法导致服务器错误。如果我们看一下那个控制器方法:
def gamestart
#...
{:word => masquerade_word}.to_json
end
我们看到它返回一个JSON字符串,但它忽略了呈现任何东西。你没有调用任何渲染或重定向方法,所以Rails有帮助(哈哈)假设你想渲染gamestart
视图模板;但是,你没有这样的东西,所以你得到一个错误。
你应该渲染你的JSON,而不是返回它;更像是这样的东西:
def gamestart
#...
render :json => { :word => masquerade_word }
end