문제

다음과 같은 것처럼 보이는 랙 응용 프로그램이 있습니다.

class Foo
  def initialize(app)
    @app = app
  end
  def call(env)
    env["hello"] = "world"
    @app.call(env)
  end
end

랙 애플리케이션을 레일에 연결 한 후 어떻게 액세스 할 수 있습니까? env["hello"] 레일 내에서?

업데이트: Gaius에게 답을 보내 주셔서 감사합니다. 랙 및 레일은 요청 기간 또는 세션 기간 동안 물건을 저장할 수 있습니다.

# in middleware
def call(env)
  Rack::Request.new(env)["foo"] = "bar"  # sticks around for one request

  env["rack.session"] ||= {}
  env["rack.session"]["hello"] = "world" # sticks around for duration of session
end

# in Rails
def index
  if params["foo"] == "bar"
    ...
  end
  if session["hello"] == "world"
    ...
  end
end
도움이 되었습니까?

해결책

나는 당신이 사용할 수 있다고 확신합니다 Rack::Request 요청-스코프 변수를 전달하기위한 객체 :

# middleware:
def call(env)
  request = Rack::Request.new(env) # no matter how many times you do 'new' you always get the same object
  request[:foo] = 'bar'
  @app.call(env)
end

# Controller:
def index
  if params[:foo] == 'bar'
    ...
  end
end

또는, 당신은 그것을 얻을 수 있습니다. "env"직접 물체 :

# middleware:
def call(env)
  env['foo'] = 'bar'
  @app.call(env)
end

# controller:
def index
  if request.env['foo'] == 'bar'
    ...
  end
end

다른 팁

짧은 대답: 사용 request.env 또는 env 컨트롤러 내부.

긴 답변 :

에 따르면 레일 컨트롤러에 대한 레일 안내서, ActionController 제공 a request 현재 HTTP 요청에 대한 정보에 액세스하는 데 사용할 수있는 방법 컨트롤러가 응답하는 방법.

문서를 추가로 검사하면 ActionController::Base#request, 우리는 그것이 "현재 요청을 나타내는 actionDisPatch :: 요청 인스턴스를 반환합니다."

우리가 문서를 보면 ActionDispatch::Request, 우리는 그것이 상속되는 것을 본다 Rack::Request. 아하! 여기 우리는 간다.

이제 문서에 익숙하지 않은 경우 Rack::Request, 기본적으로 랙 환경 주변의 래퍼입니다. 따라서 대부분의 경우 그대로 사용할 수 있어야합니다. 만약 당신이 정말로 원시 환경 해시를 원한다면, 당신은 그것을 얻을 수 있습니다 Rack::Request#env. Rails 컨트롤러 내에서 request.env.

더 깊이 파기 :

인스턴스 방법을 추가로 검토 한 후 ActionController::Base, 나는 볼 것이 많지 않다는 것을 알았습니다. 특히, 나는 params 그리고 session 변수는 누락 된 것 같습니다. 그래서 나는 한 레벨로 올라 갔다 ActionController::Metal, 어느 ActionController::Base 상속.

~ 안에 ActionController::Metal, 나는 방법을 발견했다 env 그것이 무엇을했는지에 대한 문서가 없었지만 추측 할 수있었습니다. 내가 옳았다. 그 변수였습니다 할당됩니다 request.env.

ActionController::Metal 또한 포함 params 에 따르면 방법 출처,, request.parameters 기본적으로. 결과적으로 request.parameters 출신이 아닙니다 Rack::Request, 하지만 ActionDisPatch :: http :: 매개 변수, 여기에는 포함되어 있습니다 ActionDispatch::Request. 이 방법은 Rack::Request#params 변경 사항을 제외하고는 Rails 특이 적 랙 환경 변수를 수정하는 방법 (따라서 변경 사항에 따라 변경 사항이 계속 유지됩니다. ActionDispatch::Request).

그러나 나는 여전히 그것을 찾을 수 없었습니다 session 방법. 문서에 전혀 그렇지 않습니다. 소스 코드를 검색 한 후 ActionController::Metal, 나는 마침내 그것을 발견했다 이 라인. 맞아요, 그것은 단지 바로 가기 일뿐입니다. request.session.

요약:

컨트롤러에서 ...

  • 사용 request.env 또는 env 원시 환경 개체에 도달합니다
  • 사용 params 랙 쿼리 문자열을 읽고 랙 입력 스트림에서 데이터를 게시합니다. (예 : Rack::Request#params)
  • 사용 session 값에 액세스하려면 rack.session 랙 환경에서

미들웨어에서 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top