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.