首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果没有模板,则需要呈现不返回json。

如果没有模板,则需要呈现不返回json。
EN

Stack Overflow用户
提问于 2013-01-13 05:31:18
回答 1查看 5.2K关注 0票数 0

我正试图让Sinatra应用程序的代码在Rails环境中工作。Sinatra应用程序使用ajax请求来触发Sinatra路由/控制器操作。例如,如果在javascript模型上触发新函数

代码语言:javascript
复制
   new: function() {
      var _this = this;

      $.ajax({
        url: "/gamestart",
        type: "POST",  
     ....

它将触发Sinatra应用程序中的路由/控制器代码。

代码语言:javascript
复制
   post "/new" do

   end

当我试图在Rails中工作时,我得到了一个500个内部服务器错误。在我的Rails应用程序中,new_game按钮触发对Rails路由的ajax请求,Rails路由触发控制器操作,该控制器操作使用Rails模型从数据库中获取数据。由于某些原因,在Rails中这样做似乎不是正确的方法,我想知道这是否是我得到服务器错误的原因

代码语言:javascript
复制
   GET http://localhost:3000/gamestart 500 (Internal Server Error)

如果可能的话,你能告诉我在下面列出的操作链中哪里出现了这个错误,以及我可以做些什么来修复它。

1单击新的游戏按钮触发器'startNewGame‘方法

代码语言:javascript
复制
'click #new_game': 'startNewGame',

2游戏模型上的startNewGame方法调用方法

代码语言:javascript
复制
 startNewGame: function() {
          this.model.new();
        },

游戏模型中的新方法3向url '/gamestart‘发出一个GET请求。我也尝试了一个帖子请求。我不知道为什么要发邮件,但两者都没有用。(在最初的Sinatra应用程序中,gamestart url立即引入函数post '/gamestart‘do.)

代码语言:javascript
复制
 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路由器文件中的控制器操作。

代码语言:javascript
复制
match 'gamestart' => 'locations#gamestart', :via => :get

注意,在原来的Sinatra应用程序中,路由和控制器操作是结合在一起的。

5 -- locations_controller.rb的游戏启动方法

代码语言:javascript
复制
    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模型Word.rb上的get_random方法,该方法是从位置控制器调用的

代码语言:javascript
复制
   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

错误消息

代码语言:javascript
复制
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方式结合在一起。

代码语言:javascript
复制
 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错误。

代码语言:javascript
复制
   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错误

代码语言:javascript
复制
    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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-13 06:37:13

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

代码语言:javascript
复制
def gamestart 
  #...
  {:word => masquerade_word}.to_json
end

我们看到它返回一个JSON字符串,但是它忽略了呈现任何东西。您不调用任何呈现或重定向方法,因此Rails ( have )假设您想要呈现gamestart视图模板;但是,您没有这样的东西,因此您会得到一个错误。

您应该呈现您的JSON,而不是返回它;更像这样:

代码语言:javascript
复制
def gamestart
  #...
  render :json => { :word => masquerade_word }
end
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14300964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档