没有模板,需要渲染不返回json

时间:2013-01-13 05:31:19

标签: ruby-on-rails backbone.js

我正在尝试使用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

1 个答案:

答案 0 :(得分:4)

您说由于缺少模板,您的gamestart控制器方法导致服务器错误。如果我们看一下那个控制器方法:

def gamestart 
  #...
  {:word => masquerade_word}.to_json
end

我们看到它返回一个JSON字符串,但它忽略了呈现任何东西。你没有调用任何渲染或重定向方法,所以Rails有帮助(哈哈)假设你想渲染gamestart视图模板;但是,你没有这样的东西,所以你得到一个错误。

你应该渲染你的JSON,而不是返回它;更像是这样的东西:

def gamestart
  #...
  render :json => { :word => masquerade_word }
end