Làm cách nào tôi có thể nhận được URL tuyệt đối hiện tại trong chế độ xem Ruby on Rails của tôi?
Các request.request_uri
chỉ trả về tương URL .
Làm cách nào tôi có thể nhận được URL tuyệt đối hiện tại trong chế độ xem Ruby on Rails của tôi?
Các request.request_uri
chỉ trả về tương URL .
Câu trả lời:
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
Bạn có thể viết "#{request.protocol}#{request.host_with_port}#{request.fullpath}"
, vì request.url
bây giờ không được dùng nữa.
Bạn có thể viết request.url
thay 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 đủ.
fullpath
KHÔ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!
"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}"
"http://#{request.host}:#{request.port}#{request.fullpath}"
request.url
bị 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/... )
Bạn đã có thể sử dụng url_for(only_path: false)
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ế.
request.uri
và điều này đã được chỉ ra nhiều lần trong câu hỏi này, nhưng ... ok, cảm ơn
Nếu bạn đang sử dụng Rails 3.2 hoặc Rails 4, bạn nên sử dụng request.original_url
để lấy URL hiện tại.
Tài liệu cho phương pháp này có tại http://api.rubyonrails.org/groupes/ActionDispatch/Request.html#method-i-origen_url nhưng nếu bạn tò mò thì việc triển khai là:
def original_url
base_url + original_fullpath
end
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
url_for params.merge(:format => "PDF", :only_path => false)
link_to
bạn chỉ có thể sử dụng params.merge
và bỏ qua url_for
hoàn toàn
Trong Ruby on Rails 3.1.0.rc4:
request.fullpath
fullpath
không cung cấp một absolute URL
poster như yêu cầu ban đầu.
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"))
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!
Có vẻ như request_uri
không được dùng trong Ruby on Rails 3.
Using #request_uri is deprecated. Use fullpath instead.
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
Đ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']
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 /404
thay vì như mong đợi /non-existing-mumbo-jumbo
.
Những gì tôi cần sử dụng là
request.original_url
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
:root_url
lấ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")
và 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_name
là 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.
root_url
.
Trong Rails 3, bạn có thể sử dụng
request.original_url
http://apidock.com/rails/v3.2.8/ActionDispatch/Request/origen_url
Đườ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"
Đố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
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.
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.
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
Để có được URL tuyệt đối có nghĩa là from the root
nó 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