Ruby on Rails'daki mevcut mutlak URL'yi nasıl edinebilirim?


Yanıtlar:


1443

Rails 3.2 veya Rails 4+ için

request.original_urlGeçerli URL'yi almak için kullanmalısınız .

Bu yöntem original_url yönteminde belgelenmiştir , ancak merak ediyorsanız uygulama şu şekildedir:

def original_url
  base_url + original_fullpath
end

Raylar 3 için:

Sen yazabilir "#{request.protocol}#{request.host_with_port}#{request.fullpath}"beri, request.urlartık uygun bulunmamaktadır.


Raylar 2 için:

Bunun request.urlyerine yazabilirsiniz request.request_uri. Bu, protokolü (genellikle http: //) ana bilgisayarla ve request_uri'yi tam adresi vermek için birleştirir.


31
diğer kullanıcıların işaret ettiği gibi: DEPRECATION UYARI: #request_uri kullanımı kullanımdan kaldırılmıştır. Bunun yerine fullpath kullanın
giladbu

9
@giladbu fullpathprotokolü / domain / portu İÇERMEZ! Mutlak bir URL değil!
Alan H.

37
"http://#{request.host+request.fullpath}"(liman önemliyse) veya başka bir şekilde çalışacaktır"http://#{request.host}:#{request.port+request.fullpath}"
Nilloc

7
bağlantı noktası önemliyse, bu doğru çalışır: "http://#{request.host}:#{request.port}#{request.fullpath}"
Sucrenoir

3
request.urlOnaylanmayan talep için bir referansı gösterebilir misiniz? Önerilen çözüm, request.urlzaten ne yaptığını söylemenin uzun bir yoludur ; uygulama sadece protokol + host_with_port + fullpath ( github.com/rails/rails/blob/… )
mhartl

134

Sanırım Ruby on Rails 3.0 yöntemi şimdi request.fullpath.


13
fullpath alan adını içermiyor
lulalala

Ben aslında nasıl etki alanı dahil etmek için arama gibi sağlanan sevindim.
Jake

121

Kullanabilirsin url_for(only_path: false)


Benim (biraz özel durumda) bu neredeyse tam olarak istediğim şeydi. Seçeneği true olarak değiştirdim ve mevcut sayfanın URL'sini seçenekler olmadan aldım. Teşekkürler :)
Spiralis

@David Görünümde değil. Ama yine de orada kullanılmamalıdır =)
Lyuben Todorov

Benim durumumda ana bilgisayar adını değiştirmek ama her şeyi saklamak istedim. Ben url_for (host: 'www.newdomain.com') soruna bir çözüm olarak benim için en iyi çalıştı bulundu. IMO, tüm ray sürümlerinde aynı olduğu için daha sağlam bir çözümdür.
PeppyHeppy

1
FYI Aynı kaynak için birden fazla yolunuz varsa, bu çalışmaz.
thekingoftruth

68

DEPRECATION UYARI: #request_uri kullanımı kullanımdan kaldırılmıştır . Bunun yerine tam yol kullanın.


4
Yanıt stackoverflow.com/a/2165727/166279 ile ilgili notlara bakın , tam yol etki alanını içermez.
Nilloc

Bu satır, yazı yazarken doğrudan kütükten geldi request.urive bu zaten bu soruda birkaç kez işaret edildi, ancak ... tamam, teşekkürler
ecoologic

1
@ManishShrivastava: komik, daha karmaşık soruları cevaplamak için tüm "orijinal" çaba rağmen, bu kopya ve yapıştır bana en yüksek puanı verdi, iyi ... hiçbir şeyden daha iyi
ecoologic


52

Geçerli URL'yi döndürmek ve diğer parametrelerde birleştirmeye izin vermek için bu current_url yöntemini ApplicationController öğesine ekleyebilirsiniz.

# 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

Örnek Kullanım:

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

1
Bu, Rails 3.1'de tanımlanmış gibi görünmemektedir.
Alan H.

1
bunu bu şekilde yapabilirsinizurl_for params.merge(:format => "PDF", :only_path => false)
montrealmike

2
Ayrıca bir link_toiseniz, sadece kullanmak params.mergeve url_fortamamen atlayabilirsiniz
montrealmike

36

Ruby on Rails 3 için:

request.url
request.host_with_port

Bir hata ayıklayıcı oturumu ateş ve istek nesnesini sorguladı:

request.public_methods


28

Uygulama URL'sine ihtiyacım vardı ama alt dizinle. Kullandım:

root_url(:only_path => false)

27
 url_for(params)

Ve kolayca yeni bir parametre ekleyebilirsiniz:

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

5
Bu, onaylanan cevaptan çok daha zariftir (daha az ayrıntılı ise).
Olivier Lacan

16

Bence request.domain işe yarayacaktır, ama ya blah.blah.com gibi bir alt dizindeyseniz? Böyle bir şey işe yarayabilir:

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

Parametreleri yol yapınıza göre değiştirin.

Umarım yardımcı olur!


8
Evet Jaime'nin cevabı çok daha iyi, ama gerçekten verimsiz olmak istiyorsanız, bunu kendi tarzımla yapabilirsiniz.
James M

14

request_uriRuby on Rails 3'te kullanımdan kaldırılmış gibi görünüyor .

Using #request_uri is deprecated. Use fullpath instead.

13

Ruby 1.9.3-p194 ve Ruby on Rails 3.2.6'yı kullanma:

Eğer request.fullpath sizin için çalışmaz, deneyin request.env [ "HTTP_REFERER"]

İşte benim hikayem aşağıda.

Örneğin, farklı denetleyicilerin bilgilerini birleştiren kümülatif sayfalar için geçerli URL'yi (tarayıcıda kullanıcı için adres çubuğunda gösterilen) algılamada benzer bir sorunla karşılaştım http://localhost:3002/users/1/history/issues.

Kullanıcı farklı türde sorun listelerine geçiş yapabilir. Tüm bu listeler Ajax üzerinden farklı kontrolörlerden / parçalardan yüklenir (yeniden yüklenmeden).

Sorun, listenin her bir öğesinde geri düğmesi için doğru yolu ayarlamaktı, böylece geri düğmesi hem kendi sayfasında hem de kümülatif sayfa geçmişinde düzgün çalışabiliyordu .

Request.fullpath kullanmam durumunda , kesinlikle aradığım URL olmayan son JavaScript isteğinin yolunu döndürür.

Bu yüzden son yeniden yüklenen isteğin URL'sini saklayan request.env ["HTTP_REFERER"] kullandım.

İşte karar vermek için kısmi bir alıntı

- 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

Evet, fullpath istediğin url'yi aldın, geldiğin url'yi değil , bu da ihtiyacım olan şeydi. Bunun için teşekkürler!
Spencer Rathbun

2
Sadece ihtiyacım olan şey harika çalışıyor. Bu ayrı bir soru ve cevap olmalıdır. Burada bulmak biraz zor. : /
DDDD

12

Bu, Ruby on Rails 3.0 için çalışır ve Ruby on Rails'in çoğu sürümü tarafından desteklenmelidir:

request.env['REQUEST_URI']

11

Konudaki önerilerin hiçbiri, birinin ne aradığını bulmak için hata ayıklayıcıyı kullandığını söylediği durumlar dışında, ne yazık ki bana yardımcı olmadı.

Standart 404 ve 500 yerine bazı özel hata sayfaları oluşturdum, ancak beklenen yerine request.urlsona erdi ./404/non-existing-mumbo-jumbo

Kullanmam gereken şey

request.original_url

9

Eğer göreli olarak, sadece etki alanı olmadan demek istiyorsan, içine bak request.domain.


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

8

Ruby yöntemini kullanabilirsiniz:

:root_url

temel url ile tam yolu alacak:

localhost:3000/bla

Bu, Rails 4'te active_model_serializers kullanan serileştiricilerde çalışan tek çözümdür
Kris Khaira

Mutlak url'yi :root_urlalmak gibi bir şey kullandığımda mutlak bir URL'ye geçirdiğim parametreleri nasıl kısıtlayabileceğimi lütfen söyleyebilir misiniz ? Diyelim ki böyle bir şey kullanıyorum some_method(:products_brand_url, brand: brand, entity_name: "brand")ve some_method`def some_method (route, opts = {}) end` olarak tanımlandım http://localhost:3000/brands/brand_name?&entity_name="brand". Güzergahın benzemesini istiyorum http://localhost:3000/brands/brand_name. Ben sadece entity_namemutlak url için bir param olarak değil, opts karma bir parçası olmak istiyorum .
boddhisattva

Kesinlikle denilen Ruby yöntemi yoktur root_url.
smileart


6

raylar 3.2 için herhangi birini kullanabilirsiniz:

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

Bence her yerde çalışacak

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

6

Raylar 4.0

kullanabilirsiniz request.original_url, çıktı aşağıdaki örnekte olduğu gibi olacaktır

get "/articles?page=2"

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

4

Rails 3.2 veya Rails 4 için "request.original_url" referansını alın. Referans: Orijinal URL Yöntemi

Rails 3 için request.url kullanımdan kaldırılmıştır. Birleştirerek mutlak yol elde edebiliriz

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

Raylar 2 için

request.url

3

spesifik olmak istiyorsanız, yani, ihtiyacınız olan yolu biliyorsunuz:

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


3
request.env["REQUEST_URI"]

2.3.4 raylarda çalışır ve diğer sürümler hakkında bilmiyorum.


3

Herhangi bir sorgu parametresi olmadan istek URL'sini almak için.

def current_url_without_parameters
  request.base_url + request.path
end

3

Ya kullanabilirsiniz

request.original_url 

veya

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

Mevcut URL'yi almak için.


1

Kullanabilirsiniz:

request.full_path

veya

request.url

Umarım sorununuzu çözecektir.

Şerefe


1

Bir değişken ayarlayabilirsiniz URI.parse(current_url), henüz bu teklifi burada görmüyorum ve benim için çalışıyor.


0

Mutlak URL'yi almak için, from the rootbunun bu şekilde görüntülenebileceği anlamına gelir

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

Users_url yardımcısı, protokolü ve ana bilgisayar adını içeren bir URL oluşturur. Users_path yardımcısı yalnızca yol bölümünü oluşturur.

users_url: http://localhost/users
users_path: /users
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.