2013-02-03 8 views
18

Ho un controller che responds_with JSON per tutte le azioni RESTful, indice, creare, aggiornare ecc,respond_with ArgumentError (. Nil posizione prevista non possono costruire URI.):

class QuestionsController 

respond_to :json 

    def index 
    respond_with Question.all 
    end 

end 

Tuttavia, ho anche avere altre azioni nel controller. Per esempio, in un metodo, si verifica se una risposta era corretta e quindi tenta di restituire una variabile con un vero booleano o falso

respond_with correct_response #either true or false 

Tuttavia, questo mi sta dando l'errore

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

Ci saranno anche altri metodi che mi piacerebbe rispondere con più valori. In Sinatra, è possibile farlo per rispondere con json

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

Come farei in Rails?

Così, due domande, qual è il modo corretto di scrivere questo

respond_with correct_response 

e come respond_with più valori in un modo simile all'esempio ho mostrato da un'applicazione Sinatra.

Grazie per il vostro aiuto.

risposta

25

Si desidera ActionController::Base#render, non respond_with. Il modo corretto di fare quello che stai cercando di realizzare qui è:

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

ok, grazie, ma se voglio rendere più valori, nello stesso modo in cui tale hash è resa nell'esempio che ho fornito, come faccio allora? – BrainLikeADullPencil

+0

@BrainLikeADullPencil Risposta aggiornata. –

+0

Grazie per il vostro aiuto. Lo apprezzo molto. – BrainLikeADullPencil

5

respond_with è in realtà OK per questo scenario - succede solo a fare qualche magia per voi e si basa su avere accesso a informazioni di cui ha bisogno; dai uno sguardo a Rails 4.1.9's actionpack/lib/action_controller/metal/responder.rb.

Nel tuo caso, ArgumentError (Nil location provided. Can't build URI.) in realtà sta dicendo la verità: sta provando a determinare un URL da utilizzare dall'impostazione dell'intestazione location ma non è in grado di capirlo. Scommetto che si potrebbe ottenere il vostro codice di funzionare se avete dato uno:

class QuestionsController 
    respond_to :json 

    def index 
    respond_with Question.all, location: questions_url 
    end 
end 
Problemi correlati