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.


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.


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)


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.


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

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


28

Saya membutuhkan URL aplikasi tetapi dengan subdirektori. Saya menggunakan:

root_url(:only_path => false)

27
 url_for(params)

Dan Anda dapat dengan mudah menambahkan beberapa parameter baru:

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

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!


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.

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

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']

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

9

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


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

8

Anda dapat menggunakan metode ruby:

:root_url

yang akan mendapatkan path lengkap dengan url basis:

localhost:3000/bla

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}"

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"

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

3

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

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



3

Untuk mendapatkan URL permintaan tanpa parameter kueri apa pun.

def current_url_without_parameters
  request.base_url + request.path
end

3

Anda bisa menggunakan

request.original_url 

atau

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

untuk mendapatkan URL saat ini.


1

Kamu bisa menggunakan:

request.full_path

atau

request.url

Semoga ini akan menyelesaikan masalah Anda.

Bersulang


1

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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.