我有一个控制器,响应所有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应用程序中显示的示例的方式响应多个值。
感谢您的帮助。
答案 0 :(得分:25)
您需要ActionController::Base#render
,而不是respond_with
。做你在这里尝试实现的目标的正确方法是:
render json: {word: session[:word], correct_guess: correct_guess, incorrect_guesses: session[:incorrect_guesses], win: win}
答案 1 :(得分:7)
respond_with
实际上是可以的 - 它恰好为你做了一些魔术,并依赖于访问所需的信息;看看Rails 4.1.9' actionpack/lib/action_controller/metal/responder.rb。
在您的情况下,ArgumentError (Nil location provided. Can't build URI.)
实际上是在说实话 - 它正在尝试从location
标题设置中确定要使用的网址,但无法确定出。如果你给它一个,我打赌你可以让你的代码工作:
class QuestionsController
respond_to :json
def index
respond_with Question.all, location: questions_url
end
end