Response_with ArgumentError (предоставлено расположение Nil. Не удается создать URI.):
У меня есть контроллер, который отвечает с 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.
Спасибо за вашу помощь.
Ответы
Ответ 1
Вы хотите ActionController::Base#render
, а не respond_with
. Правильный способ сделать то, что вы пытаетесь достичь здесь:
render json: {word: session[:word], correct_guess: correct_guess, incorrect_guesses: session[:incorrect_guesses], win: win}
Ответ 2
respond_with
на самом деле нормально для этого сценария - для вас просто происходит какая-то магия и полагается на доступ к информации, которая ему нужна; взгляните на Rails 4.1.9 actionpack/lib/action_controller/metal/responder.rb.
В вашем случае ArgumentError (Nil location provided. Can't build URI.)
на самом деле говорит правду - он пытается определить URL-адрес для использования с настройкой заголовка location
, но не может понять это. Я бы поставил пари, что вы можете заставить свой код работать, если вы его дали:
class QuestionsController
respond_to :json
def index
respond_with Question.all, location: questions_url
end
end