Bagaimana cara mendapatkan URL absolut saat ini di Ruby on Rails?

Jawaban:

1443

Untuk Rails 3.2 atau Rails 4+

Anda harus menggunakan request.original_urluntuk mendapatkan URL saat ini.

Metode ini didokumentasikan pada metode original_url , tetapi jika Anda penasaran, implementasinya adalah:

def original_url
  base_url + original_fullpath
end

Untuk Rails 3:

Anda dapat menulis "#{request.protocol}#{request.host_with_port}#{request.fullpath}", karena request.urlsekarang sudah usang.


Untuk Rails 2:

Anda bisa menulis request.urlalih-alih request.request_uri. Ini menggabungkan protokol (biasanya http: //) dengan host, dan request_uri untuk memberi Anda alamat lengkap.

Manish Shrivastava
sumber
31
seperti yang ditunjukkan pengguna lain: PERINGATAN DEPRECASI: Menggunakan #request_uri sudah usang. Gunakan fullpath sebagai gantinya
giladbu
9
@ giladbu fullpathTIDAK termasuk protokol / domain / port! Ini bukan URL absolut!
Alan H.
37
"http://#{request.host+request.fullpath}"akan bekerja atau sebaliknya, (jika port penting)"http://#{request.host}:#{request.port+request.fullpath}"
Nilloc
7
jika port penting, ini berfungsi dengan baik: "http://#{request.host}:#{request.port}#{request.fullpath}"
Sucrenoir
3
Bisakah Anda menunjukkan referensi untuk klaim yang request.urlsudah usang? Solusi yang diusulkan hanyalah cara panjang untuk mengatakan apa yang request.urlsudah dilakukan; implementasi hanyalah protokol + host_with_port + fullpath ( github.com/rails/rails/blob/… )
mhartl
134

Saya pikir metode Ruby on Rails 3.0 sekarang request.fullpath.

mcr
sumber
13
fullpath tidak termasuk domain
lulalala
Saya senang ini disediakan karena saya benar-benar mencari cara untuk tidak memasukkan domain.
Jake
121

Anda bisa menggunakannya url_for(only_path: false)

Grzuy
sumber
Dalam (kasus khusus saya), ini hampir persis seperti yang saya inginkan. Saya baru saja mengubah opsi menjadi true dan mendapatkan url untuk halaman saat ini, tanpa opsi. Terima kasih :)
Spiralis
@ David tidak dalam Lihat itu tidak. Tapi itu seharusnya tidak digunakan di sana =)
Lyuben Todorov
Dalam kasus saya, saya ingin mengganti nama host tetapi menyimpan yang lainnya. Saya menemukan bahwa url_for (host: 'www.newdomain.com') bekerja paling baik untuk saya sebagai solusi untuk masalah tersebut. IMO, ini adalah solusi yang lebih kuat karena sama di semua versi rel.
PeppyHeppy
1
FYI Ini tidak akan berfungsi jika Anda memiliki banyak jalur untuk sumber daya yang sama.
thekingoftruth
68

PERINGATAN DEPRECASI : Menggunakan #request_uri sudah tidak digunakan lagi . Gunakan jalur penuh sebagai gantinya.

ekoologi
sumber
4
Lihat catatan pada jawaban stackoverflow.com/a/2165727/166279 , jalur penuh tidak menyertakan domain.
Nilloc
baris ini datang langsung dari log pada saat penulisan saat menggunakan request.uridan ini telah ditunjukkan beberapa kali dalam pertanyaan ini, tapi ... ok, terima kasih
ecoologic
1
@ManishShrivastava: lucu, terlepas dari semua upaya "asli" yang saya berikan menjawab pertanyaan yang lebih kompleks, salin dan tempel ini memberi saya skor tertinggi, baik ... lebih baik daripada tidak sama sekali
ecoologic
52

Anda dapat menambahkan metode current_url ini di ApplicationController untuk mengembalikan URL saat ini dan memungkinkan penggabungan dalam parameter lainnya

# 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

Contoh penggunaan:

current_url --> http://...
current_url(:page=>4) --> http://...&page=4
lebih kotor
sumber
1
Ini tampaknya tidak didefinisikan dalam Rails 3.1.
Alan H.
1
Anda bisa melakukannya dengan cara iniurl_for params.merge(:format => "PDF", :only_path => false)
montrealmike
2
juga jika Anda berada dalam link_toAnda hanya dapat menggunakan params.mergedan melewati url_forsemuanya
montrealmike
36

Untuk Ruby on Rails 3:

request.url
request.host_with_port

Saya menjalankan sesi debugger dan menanyakan objek permintaan:

request.public_methods
Bangsawan tinggi
sumber
32

Di Ruby on Rails 3.1.0.rc4:

 request.fullpath
Lucas Renan
sumber
5
fullpathtidak menyediakan absolute URLseperti yang diminta poster asli.
Olivier Lacan
28

Saya membutuhkan URL aplikasi tetapi dengan subdirektori. Saya menggunakan:

root_url(:only_path => false)
Dorian
sumber
27
 url_for(params)

Dan Anda dapat dengan mudah menambahkan beberapa parameter baru:

url_for(params.merge(:tag => "lol"))
Yuri Barbashov
sumber
5
Ini jauh lebih elegan (jika kurang terperinci) daripada jawaban yang disetujui.
Olivier Lacan
16

Saya pikir request.domain akan berfungsi, tetapi bagaimana jika Anda berada di sub direktori seperti blah.blah.com? Sesuatu seperti ini bisa bekerja:

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

Ubah parameter berdasarkan pada struktur jalur Anda.

Semoga itu bisa membantu!

James M
sumber
8
Ya jawaban Jaime jauh lebih baik, tetapi jika Anda ingin benar-benar tidak efisien, Anda bisa melakukannya dengan cara saya.
James M
14

Sepertinya request_urisudah usang di Ruby on Rails 3.

Using #request_uri is deprecated. Use fullpath instead.
Ken Earley
sumber
13

Menggunakan Ruby 1.9.3-p194 dan Ruby on Rails 3.2.6:

Jika request.fullpath tidak berfungsi untuk Anda, coba request.env ["HTTP_REFERER"]

Inilah kisah saya di bawah ini.

Saya mendapat masalah serupa dengan mendeteksi URL saat ini (yang ditampilkan di bilah alamat untuk pengguna di browser-nya) untuk halaman kumulatif yang menggabungkan informasi dari pengontrol yang berbeda, misalnya http://localhost:3002/users/1/history/issues,.

Pengguna dapat beralih ke daftar berbagai jenis masalah. Semua daftar tersebut dimuat melalui Ajax dari berbagai pengontrol / parsial (tanpa memuat ulang).

Masalahnya adalah untuk menetapkan jalur yang benar untuk tombol kembali di setiap item daftar sehingga tombol kembali bisa bekerja dengan baik di halamannya sendiri dan di riwayat halaman kumulatif .

Jika saya menggunakan request.fullpath , ia mengembalikan jalur permintaan JavaScript terakhir yang jelas bukan URL yang saya cari.

Jadi saya menggunakan request.env ["HTTP_REFERER"] yang menyimpan URL dari permintaan yang dimuat ulang terakhir.

Berikut adalah kutipan dari parsial untuk membuat keputusan

- 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
Serge Seletskyy
sumber
Yup, fullpath memberi Anda url yang Anda minta, bukan url yang Anda berasal , itulah yang saya butuhkan juga. Terima kasih untuk ini!
Spencer Rathbun
2
Bekerja dengan baik, hanya apa yang saya butuhkan. Ini harus dalam pertanyaan dan jawaban yang terpisah. Agak sulit ditemukan di sini. : /
DDDD
12

Ini berfungsi untuk Ruby on Rails 3.0 dan harus didukung oleh sebagian besar versi Ruby on Rails:

request.env['REQUEST_URI']
Tim Santeford
sumber
11

Tidak ada saran di sini di utas membantu saya dengan sedih, kecuali saran di mana seseorang mengatakan dia menggunakan debugger untuk menemukan apa yang dia cari.

Saya telah membuat beberapa halaman kesalahan khusus alih-alih standar 404 dan 500, tetapi request.urlberakhir di /404bukan yang diharapkan /non-existing-mumbo-jumbo.

Apa yang perlu saya gunakan adalah

request.original_url
Frans
sumber
9

Jika secara relatif, maksud Anda hanya tanpa domain, lalu periksa request.domain.

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

Anda dapat menggunakan metode ruby:

:root_url

yang akan mendapatkan path lengkap dengan url basis:

localhost:3000/bla
Idan Wender
sumber
Ini adalah satu-satunya solusi yang bekerja di serializers menggunakan active_model_serializers di Rails 4.
Kris Khaira
Bisakah Anda jelaskan bagaimana cara membatasi params yang saya berikan pada url absolut ketika saya menggunakan sesuatu yang ingin :root_urlmendapatkan url absolut? Anggap saya menggunakan sesuatu seperti some_method(:products_brand_url, brand: brand, entity_name: "brand")dan some_methoddidefinisikan sebagai `def some_method (rute, opts = {}) end` Saya tidak ingin rute saya terlihat seperti - http://localhost:3000/brands/brand_name?&entity_name="brand". Saya ingin terlihat seperti rute http://localhost:3000/brands/brand_name. Saya hanya ingin entity_namemenjadi bagian dari hash opts dan bukan sebagai params ke url absolut.
boddhisattva
Tentu saja tidak ada metode Ruby yang dipanggil root_url.
smileart
6

Anda dapat menggunakan salah satu untuk rel 3.2:

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

Saya pikir ini akan berhasil di mana saja

"#{request.protocol}#{request.host}:#{request.port}#{request.fullpath}"
uma
sumber
6

Rails 4.0

Anda dapat menggunakan request.original_url, output akan seperti contoh di bawah ini

get "/articles?page=2"

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

Untuk Rails 3.2 atau Rails 4 Cukup dengan cara ini "request.original_url" Referensi: Metode URL Asli

Untuk Rails 3 Sebagai request.url sudah usang. Kita bisa mendapatkan path absolut dengan menyatukan

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

Untuk Rails 2

request.url
Amit
sumber
3

jika Anda ingin lebih spesifik, artinya, Anda tahu jalan yang Anda butuhkan:

link_to current_path(@resource, :only_path => false), current_path(@resource)
Victor S
sumber
3

Untuk rel 3:

request.fullpath

Pankhuri
sumber
3
request.env["REQUEST_URI"]

bekerja di rel 2.3.4 diuji dan tidak tahu tentang versi lain.

Satishakumar Awati
sumber
3

Untuk mendapatkan URL permintaan tanpa parameter kueri apa pun.

def current_url_without_parameters
  request.base_url + request.path
end
Saraf
sumber
3

Anda bisa menggunakan

request.original_url 

atau

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

untuk mendapatkan URL saat ini.

Robin Garg
sumber
1

Kamu bisa menggunakan:

request.full_path

atau

request.url

Semoga ini akan menyelesaikan masalah Anda.

Bersulang

Ali Hassan Mirza
sumber
1

Anda dapat mengatur variabel ke URI.parse(current_url), saya belum melihat proposal ini di sini dan itu berfungsi untuk saya.

RaK427
sumber
0

Untuk mendapatkan URL absolut yang artinya from the rootbisa ditampilkan seperti ini

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

Helper users_url menghasilkan URL yang menyertakan protokol dan nama host. Helper users_path hanya menghasilkan bagian jalur.

users_url: http://localhost/users
users_path: /users
Ahmad hamza
sumber