레일 내에서 랙 환경에 어떻게 액세스합니까?
-
21-08-2019 - |
문제
다음과 같은 것처럼 보이는 랙 응용 프로그램이 있습니다.
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
랙 환경에서
미들웨어에서 ...
- 환경의 속성 액세스 환경을 통한 일반적인 방법 해시
- Rails 세션에 액세스하십시오
rack.session
환경의 속성 해시 - Params를 읽으십시오
Rack::Request#params
- 매개 변수를 업데이트하십시오
Rack::Request#update_param
그리고Rack::Request#delete_param
(문서에 명시된 바와 같이Rack::Request#params
) - Rails 특정 방식으로 매개 변수를 업데이트하십시오
ActionDispatch::Http::Parameters#params
~을 통해ActionDispatch::Request