【问题标题】:respond_with ArgumentError (Nil location provided. Can't build URI.):respond_with ArgumentError(提供了 Nil 位置。无法构建 URI。):
【发布时间】:2013-02-03 21:44:42
【问题描述】:

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

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 应用程序中展示的示例的方式响应多个值。

感谢您的帮助。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

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

    render json: {word: session[:word], correct_guess: correct_guess, incorrect_guesses: session[:incorrect_guesses], win: win}
    

    【讨论】:

    • 好的,谢谢,但是如果我想渲染多个值,就像在我提供的示例中渲染哈希一样,那我该怎么做呢?
    • 感谢您的帮助。非常感谢。
    • 在 POST 调用中使用 respond_with 会导致这种情况,这很可惜。我更喜欢它而不是render。不过还是谢谢! :D
    • 与POST无关。 respond_with 是为响应 ActiveRecord 对象而构建的(实际上是 ActiveModel,但这是不同的点)。您正在使用布尔值进行响应,这并不意味着由 respond_with 处理。 POST 与它无关 - 您可以在任何类型的 HTTP 操作上使用 respond_with,只要您响应的对象的行为类似于 ActiveRecord。
    • 对于 POST 请求,我也面临同样的问题。渲染解决了我的问题。谢谢@Chris Cashwell。
    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      相关资源
      最近更新 更多