Làm cách nào để có được URL tuyệt đối hiện tại trong Ruby on Rails?


Câu trả lời:


1443

Đối với Rails 3.2 hoặc Rails 4+

Bạn nên sử dụng request.original_urlđể có được URL hiện tại.

Phương pháp này được ghi lại theo phương thức gốc_url , nhưng nếu bạn tò mò, thì việc thực hiện là:

def original_url
  base_url + original_fullpath
end

Đối với đường ray 3:

Bạn có thể viết "#{request.protocol}#{request.host_with_port}#{request.fullpath}", vì request.urlbây giờ không được dùng nữa.


Đối với đường ray 2:

Bạn có thể viết request.urlthay vì request.request_uri. Điều này kết hợp giao thức (thường là http: //) với máy chủ và request_uri để cung cấp cho bạn địa chỉ đầy đủ.


31
như những người dùng khác đã chỉ ra: CẢNH BÁO KHAI THÁC: Sử dụng #request_uri không được dùng nữa. Sử dụng fullpath thay thế
giladbu

9
@giladbu fullpathKHÔNG bao gồm giao thức / tên miền / cổng! Đây không phải là một URL tuyệt đối!
Alan H.

37
"http://#{request.host+request.fullpath}"sẽ hoạt động hoặc nếu không, (nếu cổng quan trọng)"http://#{request.host}:#{request.port+request.fullpath}"
Nilloc

7
Nếu cổng quan trọng, cái này hoạt động đúng: "http://#{request.host}:#{request.port}#{request.fullpath}"
Sucrenoir

3
Bạn có thể chỉ ra một tài liệu tham khảo cho khiếu nại request.urlbị phản đối? Giải pháp đề xuất chỉ là một cách dài để nói những gì request.urlđã làm; việc thực hiện chỉ đơn giản là giao thức + host_with_port + fullpath ( github.com/rails/rails/blob/... )
mhartl

134

Tôi nghĩ rằng phương pháp Ruby on Rails 3.0 hiện nay request.fullpath.


13
fullpath không bao gồm tên miền
lulalala

Tôi rất vui vì điều này đã được cung cấp vì tôi thực sự đang tìm kiếm cách không bao gồm tên miền.
Jake

121

Bạn đã có thể sử dụng url_for(only_path: false)


Trong trường hợp của tôi (một trường hợp đặc biệt một chút), đây gần như chính xác là những gì tôi muốn. Tôi chỉ thay đổi tùy chọn thành true và nhận url cho trang hiện tại mà không có tùy chọn. Cảm ơn :)
Xoắn ốc

@David không có trong Xem nó không. Nhưng dù sao nó cũng nên được sử dụng ở đó =)
Lyuben Todorov

Trong trường hợp của tôi, tôi muốn thay đổi tên máy chủ nhưng giữ mọi thứ khác. Tôi thấy rằng url_for (máy chủ: 'www.newdomain.com') hoạt động tốt nhất đối với tôi như là một giải pháp cho vấn đề. IMO, đây là một giải pháp mạnh mẽ hơn vì nó giống nhau trên tất cả các phiên bản đường ray.
PeppyHeppy

1
FYI Điều này sẽ không hoạt động nếu bạn có nhiều đường dẫn cho cùng một tài nguyên.
thekingoftruth

68

CẢNH BÁO KHAI THÁC: Sử dụng #request_uri không được chấp nhận . Sử dụng fullpath thay thế.


4
Xem ghi chú về câu trả lời stackoverflow.com/a/2165727/166279 , fullpath không bao gồm tên miền.
Nilloc

dòng này xuất phát trực tiếp từ nhật ký tại thời điểm viết khi sử dụng request.urivà điều này đã được chỉ ra nhiều lần trong câu hỏi này, nhưng ... ok, cảm ơn
ecoologic

1
@ManishShrivastava: buồn cười, mặc dù tất cả các nỗ lực "gốc" Tôi đặt trả lời câu hỏi phức tạp hơn, bản sao này và dán đã cho tôi số điểm cao nhất, cũng ... có còn hơn không
ecoologic


52

Bạn có thể thêm phương thức current_url này trong ApplicationContoder để trả về URL hiện tại và cho phép hợp nhất trong các tham số khác

# 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

Cách sử dụng ví dụ:

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

1
Điều này dường như không được xác định trong Rails 3.1.
Alan H.

1
bạn có thể làm theo cách nàyurl_for params.merge(:format => "PDF", :only_path => false)
montrealmike

2
ngoài ra nếu bạn ở trong một link_tobạn chỉ có thể sử dụng params.mergevà bỏ qua url_forhoàn toàn
montrealmike

36

Đối với Ruby trên Rails 3:

request.url
request.host_with_port

Tôi đã khởi động một phiên gỡ lỗi và truy vấn đối tượng yêu cầu:

request.public_methods

32

Trong Ruby on Rails 3.1.0.rc4:

 request.fullpath

5
fullpathkhông cung cấp một absolute URLposter như yêu cầu ban đầu.
Olivier Lacan

28

Tôi cần URL ứng dụng nhưng với thư mục con. Tôi đã sử dụng:

root_url(:only_path => false)

27
 url_for(params)

Và bạn có thể dễ dàng thêm một số tham số mới:

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

5
Điều này là thanh lịch hơn nhiều (nếu ít chi tiết hơn) so với câu trả lời được phê duyệt.
Olivier Lacan

16

Tôi nghĩ request.domain sẽ hoạt động, nhưng nếu bạn đang ở trong một thư mục con như blah.blah.com thì sao? Một cái gì đó như thế này có thể làm việc:

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

Thay đổi các tham số dựa trên cấu trúc đường dẫn của bạn.

Mong rằng sẽ giúp!


8
Có câu trả lời của Jaime là cách tốt hơn, nhưng nếu bạn muốn thực sự không hiệu quả, bạn có thể làm theo cách của tôi.
James M

14

Có vẻ như request_urikhông được dùng trong Ruby on Rails 3.

Using #request_uri is deprecated. Use fullpath instead.

13

Sử dụng Ruby 1.9.3-p194 và Ruby trên Rails 3.2.6:

Nếu request.fullpath không phù hợp với bạn, hãy thử request.env ["HTTP_REFERER"]

Đây là câu chuyện của tôi dưới đây.

Tôi gặp vấn đề tương tự với việc phát hiện URL hiện tại (được hiển thị trên thanh địa chỉ cho người dùng trong trình duyệt của cô ấy) cho các trang tích lũy kết hợp thông tin từ các bộ điều khiển khác nhau, ví dụ , http://localhost:3002/users/1/history/issues.

Người dùng có thể chuyển sang danh sách các loại vấn đề khác nhau. Tất cả các danh sách đó được tải thông qua Ajax từ các bộ điều khiển / partials khác nhau (không cần tải lại).

Vấn đề là đặt đường dẫn chính xác cho nút quay lại trong từng mục của danh sách để nút quay lại có thể hoạt động chính xác cả trong trang của chính nó và trong lịch sử trang tích lũy .

Trong trường hợp tôi sử dụng request.fullpath , nó sẽ trả về đường dẫn của yêu cầu JavaScript cuối cùng mà chắc chắn không phải là URL tôi đang tìm kiếm.

Vì vậy, tôi đã sử dụng request.env ["HTTP_REFERER"] để lưu URL của yêu cầu được tải lại lần cuối.

Đây là một đoạn trích từ một phần để đưa ra quyết định

- 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

Yup, fullpath giúp bạn nhận được url bạn yêu cầu, không phải url bạn đến từ đó, đây cũng là thứ tôi cần. Cám ơn vì cái này!
Spencer Rathbun

2
Hoạt động tuyệt vời, chỉ là những gì tôi cần. Điều này nên được trong một câu hỏi và câu trả lời riêng biệt mặc dù. Kinda khó tìm thấy ở đây. : /
DDDĐ

12

Điều này hoạt động cho Ruby on Rails 3.0 và được hầu hết các phiên bản Ruby on Rails hỗ trợ:

request.env['REQUEST_URI']

11

Không có gợi ý nào trong chủ đề này giúp tôi buồn bã, ngoại trừ người mà ai đó nói rằng anh ta đã sử dụng trình gỡ lỗi để tìm những gì anh ta tìm kiếm.

Tôi đã tạo một số trang lỗi tùy chỉnh thay vì 404 và 500 tiêu chuẩn, nhưng request.urlđã kết thúc /404thay vì như mong đợi /non-existing-mumbo-jumbo.

Những gì tôi cần sử dụng là

request.original_url

9

Nếu theo họ hàng, bạn có nghĩa là không có tên miền, sau đó xem xét request.domain.


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

8

Bạn có thể sử dụng phương pháp ruby:

:root_url

sẽ nhận được đường dẫn đầy đủ với url cơ sở:

localhost:3000/bla

Đây là giải pháp duy nhất hoạt động trong các bộ nối tiếp sử dụng active_model_serialulators trong Rails 4.
Kris Khaira

Bạn có thể vui lòng cho tôi biết làm thế nào tôi có thể hạn chế các thông số tôi chuyển đến một url tuyệt đối khi tôi sử dụng đôi khi muốn :root_urllấy url tuyệt đối không? Giả sử tôi đang sử dụng một cái gì đó giống như some_method(:products_brand_url, brand: brand, entity_name: "brand")some_methodđược định nghĩa là `def some_method (tuyến đường, opts = {}) end` Tôi không muốn tuyến đường của mình trông giống như - http://localhost:3000/brands/brand_name?&entity_name="brand". Tôi muốn tuyến đường trông như thế nào http://localhost:3000/brands/brand_name. Tôi chỉ muốn entity_namelà một phần của hàm băm opts chứ không phải là một tham số cho url tuyệt đối.
Bồ tát

Chắc chắn không có phương pháp Ruby nào được gọi root_url.
smileart


6

bạn có thể sử dụng bất kỳ một cho đường ray 3.2:

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

Tôi nghĩ rằng nó sẽ làm việc mọi nơi

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

6

Đường ray 4.0

bạn có thể sử dụng request.original_url, đầu ra sẽ được đưa ra như ví dụ dưới đây

get "/articles?page=2"

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

4

Đối với Rails 3.2 hoặc Rails 4 Đơn giản chỉ cần tham gia theo cách này "request.origen_url" Tham khảo: Phương thức URL gốc

Đối với Rails 3 Vì request.url không được dùng nữa. Chúng tôi có thể có đường dẫn tuyệt đối bằng cách nối

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

Đối với đường ray 2

request.url

3

Nếu bạn muốn cụ thể, ý nghĩa, bạn biết con đường bạn cần:

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


3
request.env["REQUEST_URI"]

hoạt động trong đường ray 2.3.4 được thử nghiệm và không biết về các phiên bản khác.


3

Để có được URL yêu cầu mà không có bất kỳ tham số truy vấn.

def current_url_without_parameters
  request.base_url + request.path
end

3

Bạn có thể sử dụng

request.original_url 

hoặc là

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

để lấy URL hiện tại.


1

Bạn có thể dùng:

request.full_path

hoặc là

request.url

Hy vọng nó sẽ giải quyết vấn đề của bạn.

Chúc mừng


1

Bạn có thể đặt một biến thành URI.parse(current_url), tôi chưa thấy đề xuất này ở đây và nó hoạt động với tôi.


0

Để có được URL tuyệt đối có nghĩa là from the rootnó có thể được hiển thị như thế này

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

Trình trợ giúp users_url tạo một URL bao gồm giao thức và tên máy chủ. Trình trợ giúp users_path chỉ tạo phần đường dẫn.

users_url: http://localhost/users
users_path: /users
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.