21

我有一个控制器,它为所有 RESTful 操作、索引、创建、更新等响应 JSON,

class QuestionsController

 respond_to :json

   def index
     respond_with Question.all
   end

end 

但是,我在控制器中还有其他操作。例如,在一种方法中,它检查响应是否正确,然后尝试返回具有布尔值 true 或 false 的变量

respond_with correct_response  #either true or false

但是,这给了我错误

ArgumentError (Nil location provided. Can't build URI.):

我还希望使用多个值来响应其他方法。在 Sinatra 中,您可以这样做以响应 json

{:word => session[:word], :correct_guess => correct_guess, :incorrect_guesses => session[:incorrect_guesses], :win => win}.to_json

我将如何在 Rails 中做到这一点?

所以,两个问题,写这个的正确方法是什么

respond_with correct_response

以及如何以类似于我在 Sinatra 应用程序中展示的示例的方式响应多个值。

谢谢你的帮助。

4

2 回答 2

28

你想要ActionController::Base#render,没有respond_with。做你想要在这里实现的正确方法是:

render json: {word: session[:word], correct_guess: correct_guess, incorrect_guesses: session[:incorrect_guesses], win: win}
于 2013-02-03T22:02:14.123 回答
7

respond_with在这种情况下实际上是可以的——它只是碰巧为你做了一些魔法,并且依赖于访问它需要的信息;看看 Rails 4.1.9 的actionpack/lib/action_controller/metal/responder.rb

在您的情况下,ArgumentError (Nil location provided. Can't build URI.)实际上是在说真话-它试图从location标头设置中确定要使用的 URL,但无法弄清楚。如果你给它一个,我敢打赌你可以让你的代码工作:

class QuestionsController
  respond_to :json

  def index
    respond_with Question.all, location: questions_url
  end
end
于 2015-01-14T05:51:58.480 回答