respond_with ArgumentError(提供Nil位置.无法构建URI.):

Bra*_*cil 19 ruby-on-rails

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

class QuestionsController

 respond_to :json

   def index
     respond_with Question.all
   end

end 
Run Code Online (Sandbox Code Playgroud)

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

respond_with correct_response  #either true or false
Run Code Online (Sandbox Code Playgroud)

但是,这给了我错误

ArgumentError (Nil location provided. Can't build URI.):
Run Code Online (Sandbox Code Playgroud)

还有其他方法我希望用多个值来回应.在Sinatra,你可以这样做以回应json

{:word => session[:word], :correct_guess => correct_guess, :incorrect_guesses => session[:incorrect_guesses], :win => win}.to_json
Run Code Online (Sandbox Code Playgroud)

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

那么,有两个问题,写这个的正确方法是什么

respond_with correct_response
Run Code Online (Sandbox Code Playgroud)

以及如何以类似于我从Sinatra应用程序中显示的示例的方式响应多个值.

谢谢你的帮助.

Chr*_*ell 25

你想要的ActionController::Base#render不是respond_with.做你想要达到的目标的正确方法是:

render json: {word: session[:word], correct_guess: correct_guess, incorrect_guesses: session[:incorrect_guesses], win: win}
Run Code Online (Sandbox Code Playgroud)

  • 它与POST无关.`respond_with`是为响应ActiveRecord对象而构建的(ActiveModel确实如此,但这是一个不同的观点).您正在使用布尔值进行响应,这不应由respond_with处理.POST与它无关 - 只要您响应的对象就像ActiveRecord一样,您可以对任何类型的HTTP操作使用respond_with. (10认同)

tur*_*den 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
Run Code Online (Sandbox Code Playgroud)