Ruby on Rails에서 현재 절대 URL을 어떻게 얻습니까?


답변:


1443

Rails 3.2 또는 Rails 4+

request.original_url현재 URL을 얻는 데 사용해야 합니다.

이 메소드는 original_url 메소드 에 설명되어 있지만 궁금한 점은 다음과 같습니다.

def original_url
  base_url + original_fullpath
end

레일 3의 경우 :

당신은 쓸 수 "#{request.protocol}#{request.host_with_port}#{request.fullpath}"있기 때문에, request.url지금은 사용되지 않습니다.


레일 2의 경우 :

request.url대신 쓸 수 있습니다 request.request_uri. 이것은 프로토콜 (일반적으로 http : //)과 호스트 및 request_uri를 결합하여 전체 주소를 제공합니다.


31
다른 사용자가 지적한 바와 같이 : DEPRECATION 경고 : #request_uri 사용은 더 이상 사용되지 않습니다. 대신 전체
경로

9
@giladbu fullpath는 프로토콜 / 도메인 / 포트를 포함하지 않습니다! 절대 URL이 아닙니다!
Alan H.

37
"http://#{request.host+request.fullpath}"작동하거나 그렇지 않으면, (항구가 중요한 경우)"http://#{request.host}:#{request.port+request.fullpath}"
Nilloc

7
포트가 중요한 경우,이 것이 올바르게 작동합니다. "http://#{request.host}:#{request.port}#{request.fullpath}"
Sucrenoir

3
request.url더 이상 사용되지 않는 청구에 대한 참조를 가리킬 수 있습니까 ? 제안 된 솔루션은 request.url이미 무엇을 하고 있는지를 말하는 긴 방법입니다 . 구현은 단순히 프로토콜 + host_with_port + fullpath ( github.com/rails/rails/blob/… )
mhartl

134

나는 Ruby on Rails 3.0 방법이 지금이라고 생각합니다 request.fullpath.


13
fullpath는 도메인을 포함하지 않습니다
lulalala

실제로 도메인을 포함하지 않는 방법을 검색하면서 제공 되었기 때문에 기쁩니다.
Jake

121

당신은 사용할 수 있습니다 url_for(only_path: false)


내 (약간의 특별한 경우) 이것은 거의 내가 원하는 것입니다. 방금 옵션을 true로 변경하고 옵션없이 현재 페이지의 URL을 얻었습니다. 감사합니다 :)
Spiralis

@David는보기에 없습니다. 그러나 그것은 어쨌든 사용
Lyuben Todorov

내 경우에는 호스트 이름을 변경하고 다른 모든 것을 유지하고 싶었습니다. url_for (host : 'www.newdomain.com')이 문제에 대한 해결책으로 가장 효과적이라는 것을 알았습니다. IMO는 모든 버전의 레일에서 동일하므로보다 강력한 솔루션입니다.
PeppyHeppy

1
참고 동일한 리소스에 대한 경로가 여러 개인 경우 작동하지 않습니다.
thekingoftruth

68

사용 중지 경고 : #request_uri 사용은 사용되지 않습니다 . 대신 전체 경로를 사용하십시오.


4
답변 stackoverflow.com/a/2165727/166279 에 대한 참고 사항을 참조하십시오 . fullpath에는 도메인이 포함되어 있지 않습니다.
Nilloc

이 줄은 글을 쓸 때 로그에서 곧바로 request.uri
왔으며이

1
@ManishShrivastava : 재미는 "원래"노력이 모든에도 불구하고 좀 더 복잡한 질문에 대한 답변을 넣어,이 복사 및 붙여 넣기 더 나은 아무것도보다 ... 나에게 잘 가장 높은 점수를 주었다
ecoologic


52

ApplicationController 에이 current_url 메소드를 추가 하여 현재 URL을 리턴하고 다른 매개 변수에서 병합 할 수 있습니다.

# https://x.com/y/1?page=1 
# + current_url( :page => 3 )
# = https://x.com/y/1?page=3
def current_url(overwrite={})
    url_for :only_path => false, :params => params.merge(overwrite)
end

사용법 예 :

current_url --> http://...
current_url(:page=>4) --> http://...&page=4

1
이것은 Rails 3.1에서 정의되지 않은 것 같습니다.
Alan H.

1
당신은 이런 식으로 할 수url_for params.merge(:format => "PDF", :only_path => false)
montrealmike

2
당신은에있는 경우도 link_to그냥 사용 params.merge하고 건너 뛸 url_for모두
montrealmike

36

Ruby on Rails 3의 경우 :

request.url
request.host_with_port

디버거 세션을 시작하고 요청 객체를 쿼리했습니다.

request.public_methods


28

응용 프로그램 URL이 필요 했지만 하위 디렉토리가 있습니다. 나는 사용했다 :

root_url(:only_path => false)

27
 url_for(params)

새로운 매개 변수를 쉽게 추가 할 수 있습니다.

url_for(params.merge(:tag => "lol"))

5
이것은 승인 된 답변보다 훨씬 우아합니다 (보다 세분화 된 경우).
올리비에 라칸

16

request.domain이 작동한다고 생각하지만 blah.blah.com과 같은 하위 디렉토리에 있다면 어떻게해야합니까? 이와 같은 것이 효과가 있습니다.

<%= request.env["HTTP_HOST"] + page = "/" + request.path_parameters['controller'] + "/" + request.path_parameters['action'] %>

경로 구조에 따라 매개 변수를 변경하십시오.

희망이 도움이됩니다!


8
예 Jaime의 답변이 더 나아지지만, 실제로 비효율적이기를 원한다면 내 방식대로 할 수 있습니다.
James M

14

request_uriRuby on Rails 3에서는 더 이상 사용되지 않는 것 같습니다 .

Using #request_uri is deprecated. Use fullpath instead.

13

Ruby 1.9.3-p194 및 Ruby on Rails 3.2.6 사용 :

경우 request.fullpath가 당신을 위해 작동하지 않습니다, 시도 request.env를 [ "HTTP_REFERER"]

여기 내 이야기가 있습니다.

예를 들어 다른 컨트롤러의 정보를 결합하는 누적 페이지의 현재 URL (브라우저의 사용자 주소 표시 줄에 표시)을 검색하는 것과 비슷한 문제가 http://localhost:3002/users/1/history/issues있습니다.

사용자는 다른 유형의 문제 목록으로 전환 할 수 있습니다. 이러한 모든 목록은 다른 컨트롤러 / 부분에서 Ajax를 통해로드됩니다 (다시로드하지 않음).

문제는 목록의 각 항목에서 뒤로 단추의 올바른 경로를 설정하여 뒤로 단추가 자체 페이지와 누적 페이지 기록 에서 모두 올바르게 작동하도록하는 입니다.

request.fullpath 사용하는 경우 마지막으로 요청한 URL이 아닌 마지막 JavaScript 요청의 경로를 반환합니다.

그래서 마지막으로 다시로드 된 요청의 URL을 저장하는 request.env [ "HTTP_REFERER"] 를 사용했습니다.

다음은 결정을 내리기 위해 부분적으로 발췌 한 것입니다.

- if request.env["HTTP_REFERER"].to_s.scan("history").length > 0
  - back_url = user_history_issue_path(@user, list: "needed_type")
- else
  - back_url = user_needed_type_issue_path(@user)
- remote ||= false
=link_to t("static.back"), back_url, :remote => remote

예, fullpath는 내가 요청한 URL이 아니라 요청한 URL을 가져옵니다 . 감사합니다!
스펜서 Rathbun

2
내가 필요한 것만으로 훌륭하게 작동합니다. 이것은 별도의 질문과 대답에 있어야합니다. 여기서 찾기가 힘듭니다. : /
DDDD

12

이는 Ruby on Rails 3.0에서 작동하며 대부분의 Ruby on Rails 버전에서 지원되어야합니다.

request.env['REQUEST_URI']

11

누군가가 디버거를 사용하여 자신이 찾은 것을 찾는다고 말한 것을 제외하고는 스레드의 제안 중 슬프게도 도움이되지 않았습니다.

표준 404 및 500 대신 일부 사용자 정의 오류 페이지를 만들었지 만 request.urlexpect /404대신 종료되었습니다 /non-existing-mumbo-jumbo.

내가 사용해야 할 것은

request.original_url

9

상대적으로 도메인이없는 것을 의미하는 경우를 살펴보십시오 request.domain.


8
(url_for(:only_path => false) == "/" )? root_url : url_for(:only_path => false)

8

루비 방법을 사용할 수 있습니다 :

:root_url

기본 URL로 전체 경로를 얻습니다.

localhost:3000/bla

이 레일 4에 active_model_serializers를 사용하여 시리얼 라이저에서 작동하는 유일한 솔루션입니다
크리스 Khaira

절대 URL :root_url을 얻는 것과 같은 것을 사용할 때 절대 URL에 전달하는 매개 변수를 어떻게 제한 할 수 있습니까? 내가 좋아하는 뭔가를저기서있어 가정 some_method(:products_brand_url, brand: brand, entity_name: "brand")하고 some_method내가 좋아하는 모습에 내 길을 원하지 않는다`데프 some_method (경로, OPTS = {}) 끝 '으로 정의된다 - http://localhost:3000/brands/brand_name?&entity_name="brand". 경로가 다음과 같이 보이기를 원합니다 http://localhost:3000/brands/brand_name. 나는 단지 entity_nameURL을 매개 변수로 사용하지 않고 opts 해시의 일부가 되기를 원합니다 .
boddhisattva

확실히 라는 루비 메소드 가 없습니다 root_url.
smileart


6

레일 3.2 중 하나를 사용할 수 있습니다.

request.original_url
or
request.env["HTTP_REFERER"]
or
request.env['REQUEST_URI']

나는 그것이 모든 곳에서 작동 할 것이라고 생각한다

"#{request.protocol}#{request.host}:#{request.port}#{request.fullpath}"

6

레일스 4.0

사용할 수 있습니다 request.original_url. 출력은 아래 예와 같습니다.

get "/articles?page=2"

request.original_url # => "http://www.example.com/articles?page=2"

4

Rails 3.2 또는 Rails 4의 경우 "request.original_url"참조 : 원래 URL 메소드

Rails 3의 경우 request.url이 더 이상 사용되지 않으므로 연결하여 절대 경로를 얻을 수 있습니다.

"#{request.protocol}#{request.host_with_port}#{request.fullpath}"

레일 2

request.url

3

구체적이고 의미가 있다면 필요한 경로를 알고 있습니다.

link_to current_path(@resource, :only_path => false), current_path(@resource)



3

쿼리 매개 변수없이 요청 URL을 가져옵니다.

def current_url_without_parameters
  request.base_url + request.path
end

3

둘 중 하나를 사용할 수 있습니다

request.original_url 

또는

"#{request.protocol}#{request.host_with_port}" 

현재 URL을 가져옵니다.


1

당신이 사용할 수있는:

request.full_path

또는

request.url

잘하면 그것은 당신의 문제를 해결할 것입니다.

건배


1

변수를로 설정할 수 있습니다. URI.parse(current_url)이 제안은 아직 보이지 않으며 저에게 효과적입니다.


0

절대 URL을 얻으려면 다음 from the root과 같이 표시 할 수 있습니다.

<%= link_to 'Edit', edit_user_url(user) %>

users_url 헬퍼는 프로토콜 및 호스트 이름이 포함 된 URL을 생성합니다. users_path 헬퍼는 경로 부분 만 생성합니다.

users_url: http://localhost/users
users_path: /users
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.