Console Rails e `app.get` resultam no navegador

Se você já usou appo do rails console, você deve saber que ele permite que você faça solicitações ao seu aplicativo da mesma forma que o seu navegador faria.
Por exemplo, acessar a página inicial é tão fácil quanto [1]:

app.get root_path

O básico

Agora, você pode até ver o corpo da resposta com app.response.body. Mas e se a resposta se tornar muito grande para ser facilmente visualizada em seu terminal, ou se incluir alguma tag html? A leitura do console pode ser impossível.

Para aliviar sua dor, você pode definir um método que escreveria a resposta em um arquivo:

def write_response file_path = nil
file_path
||= "#{Rails.root}/tmp/response.#{response_type}"
File.open( file_path, 'w' ) { |file| file.write app.response.body }
end

A partir daqui, você só precisa abrir seu navegador para aquele arquivo e será como se você tivesse feito isso de verdade.

Não o defina sempre!

Não se esqueça de que você pode salvar métodos em seu shell! Adicionar as linhas acima ao seu .pryrcpermitirá que você acesse esse método sempre que iniciar o rails console.

Indo além

É claro que, para páginas normais, isso não é de muito interesse, mas se seu aplicativo tiver uma API e você precisar se registrar aqui para emitir solicitações, você pode definir algo como o seguinte:

class ApiHelper
# give access to named routes
include
Rails.application.routes.url_helpers

# if you login to your api via a token
attr_accessor
:token
attr_reader
:app

# be sure to share the same session of app!
def initialize(app)
@app = app
end

# login a user
def log user, password
@app.post api_v1_login_path, {
user
: {
login
: user.login,
password
: password,
}
}

@token = JSON.parse(@app.response.body)["data"]["authentication_token"]
end

# write server response to file
def write_response file_path = nil
# return if no request has been made
return "No response from app... Did you issue one?" unless @app.response

# get response type (html, json, ...)
response_type
= @app.response.content_type.to_s[/w+/(w+)/, 1]

# if no file_path has been supplied, write it to tmp
file_path
||= "#{Rails.root}/tmp/response.#{response_type}"

File.open( file_path, 'w' ) { |file| file.write @app.response.body }

# be nice and print the link pointing to the file
"file://#{file_path}"
end

Para usá-lo:

# instanciate a new ApiHelper
api
= ApiHelper.new app

# log a user
api
.log User.first, 'password'

# write response to a file readable by your browser
api
.write_response
#=> "file:///home/coder/rails/project/tmp/response.json"
  1. Para acessar rotas nomeadas, você deve include Rails.application.routes.url_helpers