ฉันจะรับ URL สัมบูรณ์ปัจจุบันใน Ruby on Rails ได้อย่างไร


คำตอบ:


1443

สำหรับ Rails 3.2 หรือ Rails 4+

คุณควรใช้request.original_urlเพื่อรับ URL ปัจจุบัน

วิธีนี้ได้รับการบันทึกไว้ที่วิธี original_urlแต่หากคุณสงสัยการใช้งานคือ:

def original_url
  base_url + original_fullpath
end

สำหรับ Rails 3:

คุณสามารถเขียน"#{request.protocol}#{request.host_with_port}#{request.fullpath}"ได้เนื่องจากrequest.urlขณะนี้เลิกใช้แล้ว


สำหรับ Rails 2:

คุณสามารถเขียนแทนrequest.url request.request_uriวิธีนี้รวมโปรโตคอล (โดยปกติคือ http: //) กับโฮสต์และ request_uri เพื่อให้ที่อยู่แบบเต็มแก่คุณ


31
ตามที่ผู้ใช้รายอื่นชี้: การเลิกใช้งานคำเตือน: การใช้ #request_uri เลิกใช้แล้ว ใช้ fullpath แทน
giladbu

9
@giladbu fullpathไม่รวมถึงโปรโตคอล / โดเมน / พอร์ต! ไม่ใช่ URL ที่สมบูรณ์!
Alan H.

37
"http://#{request.host+request.fullpath}"จะทำงานหรือมิฉะนั้น (ถ้าพอร์ตมีความสำคัญ)"http://#{request.host}:#{request.port+request.fullpath}"
Nilloc

7
ถ้าพอร์ตสำคัญสิ่งนี้ใช้ได้: "http://#{request.host}:#{request.port}#{request.fullpath}"
Sucrenoir

3
คุณสามารถชี้ไปที่การอ้างอิงสำหรับการอ้างสิทธิ์ที่request.urlเลิกใช้แล้วได้หรือไม่? วิธีแก้ปัญหาที่เสนอเป็นเพียงวิธีที่ยาวในการพูดในสิ่งที่request.urlทำไปแล้ว การใช้งานเป็นเพียงโปรโตคอล + host_with_port + fullpath ( github.com/rails/rails/blob/
......

134

ฉันคิดว่า Ruby on Rails วิธี 3.0 request.fullpathอยู่ในขณะนี้


13
fullpath ไม่รวมโดเมน
lulalala

ฉันดีใจที่มีให้เพราะจริง ๆ แล้วฉันกำลังค้นหาวิธีที่จะไม่รวมโดเมน
Jake

121

คุณสามารถใช้ url_for(only_path: false)


ในกรณีของฉัน (เป็นกรณีพิเศษเล็กน้อย) นี่เป็นสิ่งที่ฉันต้องการ ฉันเพิ่งเปลี่ยนตัวเลือกเป็นจริงและได้รับ URL สำหรับหน้าปัจจุบันโดยไม่มีตัวเลือก ขอบคุณ :)
Spiralis

@ David ไม่ได้อยู่ในมุมมองมันไม่ได้ แต่ไม่ควรใช้ที่นั่นต่อไป =)
Lyuben Todorov

ในกรณีของฉันฉันต้องการเปลี่ยนชื่อโฮสต์ แต่เก็บทุกอย่างไว้เป็นอื่น ฉันพบว่า url_for (โฮสต์: 'www.newdomain.com') ทำงานได้ดีที่สุดสำหรับฉันในการแก้ปัญหา IMO เป็นโซลูชั่นที่มีประสิทธิภาพมากขึ้นเนื่องจากมีความเหมือนกันในทุกรุ่นของราง
PeppyHeppy

1
FYI สิ่งนี้จะไม่ทำงานหากคุณมีหลายเส้นทางสำหรับทรัพยากรเดียวกัน
thekingoftruth

68

คัดค้านคำเตือน: การใช้ #request_uri จะเลิก ใช้ fullpath แทน


4
ดูหมายเหตุเกี่ยวกับคำตอบstackoverflow.com/a/2165727/166279 fullpath ไม่รวมโดเมน
Nilloc

บรรทัดนี้มาตรงจากบันทึกเมื่อเขียนเมื่อใช้งานrequest.uriและสิ่งนี้ได้ชี้ให้เห็นแล้วหลายครั้งในคำถามนี้ แต่ ... ตกลงขอบคุณ
ecoologic

1
@ManishShrivastava: ตลกทั้งๆที่ความพยายาม "ต้นฉบับ" ทั้งหมดที่ฉันตอบคำถามที่ซับซ้อนมากขึ้นสำเนาและวางนี้ให้คะแนนสูงสุดแก่ฉันดี ... ดีกว่าไม่มีอะไรเลย
ecoologic

61

หากคุณใช้Rails 3.2หรือRails 4คุณควรใช้request.original_urlเพื่อรับ URL ปัจจุบัน


เอกสารสำหรับวิธีการอยู่ที่http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-original_urlแต่ถ้าคุณอยากรู้ว่าการใช้งานคืออะไร:

def original_url
  base_url + original_fullpath
end

52

คุณสามารถเพิ่มเมธอดcurrent_urlนี้ใน ApplicationController เพื่อส่งคืน URL ปัจจุบันและอนุญาตให้รวมในพารามิเตอร์อื่น

# 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

ตัวอย่างการใช้งาน:

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

1
สิ่งนี้ไม่ได้ถูกกำหนดใน Rails 3.1
Alan H.

1
คุณสามารถทำมันด้วยวิธีนี้url_for params.merge(:format => "PDF", :only_path => false)
montrealmike

2
ถ้าคุณอยู่ในlink_toคุณก็สามารถใช้params.mergeและข้ามurl_forโดยสิ้นเชิง
montrealmike

36

สำหรับ Ruby on Rails 3:

request.url
request.host_with_port

ฉันเปิดเซสชันดีบักเกอร์และสอบถามวัตถุคำขอ:

request.public_methods


28

ฉันต้องการURLแอปพลิเคชันแต่มีไดเรกทอรีย่อย ฉันใช้:

root_url(:only_path => false)

27
 url_for(params)

และคุณสามารถเพิ่มพารามิเตอร์ใหม่ได้อย่างง่ายดาย:

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

5
นี่คือสง่างามมาก (ถ้าละเอียดน้อยกว่า) คำตอบที่ได้รับการอนุมัติ
Olivier Lacan

16

ฉันคิดว่า request.domain จะทำงานได้ แต่ถ้าคุณอยู่ในไดเรกทอรีย่อยเช่น blah.blah.com สิ่งนี้สามารถใช้งานได้:

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

เปลี่ยนพารามิเตอร์ตามโครงสร้างพา ธ ของคุณ

หวังว่าจะช่วย!


8
ใช่คำตอบของไจนั้นดีกว่า แต่ถ้าคุณต้องการไร้ประสิทธิภาพจริงๆคุณสามารถทำตามวิธีของฉันได้
James M


13

การใช้ Ruby 1.9.3-p194 และ Ruby บน Rails 3.2.6:

หากrequest.fullpath ใช้ไม่ได้กับคุณให้ลองrequest.env ["HTTP_REFERER"]

นี่คือเรื่องราวของฉันด้านล่าง

ผมมีปัญหาที่คล้ายกันกับการตรวจสอบ URL ปัจจุบัน (ซึ่งจะแสดงในแถบที่อยู่สำหรับผู้ใช้เบราว์เซอร์ของเธอ) http://localhost:3002/users/1/history/issuesสำหรับหน้าสะสมซึ่งรวมข้อมูลจากตัวควบคุมที่แตกต่างกันเช่น

ผู้ใช้สามารถสลับไปยังรายการประเภทของปัญหาต่างๆ รายการทั้งหมดเหล่านี้จะถูกโหลดผ่าน Ajax จากส่วนควบคุม / ส่วนต่างๆ (โดยไม่ต้องโหลดซ้ำ)

ปัญหาก็คือการกำหนดเส้นทางที่ถูกต้องสำหรับปุ่มย้อนกลับในรายการแต่ละรายการเพื่อให้ปุ่มย้อนกลับสามารถทำงานได้อย่างถูกต้องทั้งในหน้าของตัวเองและในหน้าสะสมประวัติศาสตร์

ในกรณีที่ฉันใช้request.fullpathจะส่งคืนพา ธ ของการร้องขอ JavaScript ล่าสุดซึ่งไม่ใช่ URL ที่ฉันกำลังมองหา

ดังนั้นฉันจึงใช้request.env ["HTTP_REFERER"]ซึ่งเก็บ URL ของคำขอโหลดใหม่ล่าสุด

นี่คือข้อความที่ตัดตอนมาจากบางส่วนเพื่อการตัดสินใจ

- 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

ใช่ Fullpath ทำให้คุณได้รับ URL ที่คุณร้องขอไม่ใช่ URL ที่คุณได้รับซึ่งเป็นสิ่งที่ฉันต้องการเช่นกัน ขอบคุณสำหรับสิ่งนี้!
Spencer Rathbun

2
ใช้งานได้ดีเพียงสิ่งที่ฉันต้องการ นี่ควรเป็นคำถามและคำตอบแยกต่างหาก ค่อนข้างหายากที่นี่ : /
DDDD


11

ไม่มีคำแนะนำในหัวข้อนี้ที่ช่วยให้ฉันเศร้านอกจากที่ใครบางคนบอกว่าเขาใช้ดีบักเกอร์เพื่อค้นหาสิ่งที่เขามองหา

ฉันได้สร้างบางหน้าข้อผิดพลาดที่กำหนดเองแทนมาตรฐาน 404 และ 500 แต่request.urlจบลงด้วยการแทนความคาดหวัง/404/non-existing-mumbo-jumbo

สิ่งที่ฉันต้องการใช้คือ

request.original_url

9

request.domainถ้าโดยญาติคุณหมายถึงเพียงโดยไม่ต้องโดเมนแล้วมองเข้าไปใน



8

คุณสามารถใช้วิธี ruby:

:root_url

ซึ่งจะได้รับเส้นทางแบบเต็มพร้อม URL พื้นฐาน:

localhost:3000/bla

นี่เป็นทางออกเดียวที่ทำงานใน serializers โดยใช้ active_model_serializers ใน Rails 4
Kris Khaira

คุณช่วยบอกฉันว่าฉันจะ จำกัด params ที่ฉันส่งไปยัง url สัมบูรณ์ได้อย่างไรเมื่อฉันใช้ somethin :root_urlเพื่อรับ url ที่แน่นอน สมมติผม usin ซัมชอบsome_method(:products_brand_url, brand: brand, entity_name: "brand")และsome_methodถูกกำหนดให้เป็น `def some_method (เส้นทาง opts = {}) ปลาย` ฉันไม่ต้องการเส้นทางของฉันที่จะมีลักษณะเหมือน http://localhost:3000/brands/brand_name?&entity_name="brand"- http://localhost:3000/brands/brand_nameฉันต้องการเส้นทางจะมีลักษณะเหมือน ฉันแค่อยากentity_nameให้เป็นส่วนหนึ่งของ opts hash และไม่เป็น params ของ url แบบสัมบูรณ์
boddhisattva

แน่นอนไม่มีทับทิมroot_urlวิธีการที่เรียกว่า
smileart


6

คุณสามารถใช้อันใดอันหนึ่งสำหรับราง 3.2:

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

ฉันคิดว่ามันจะทำงานทุกที่

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


4

สำหรับ Rails 3.2 หรือ Rails 4 เพียงใช้วิธีนี้ "request.original_url" อ้างอิง: วิธีการ URL ดั้งเดิม

สำหรับ Rails 3 As request.url ไม่ได้รับการสนับสนุนเราสามารถหาพา ธ สัมบูรณ์ได้โดยทำการต่อ concatenating

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

สำหรับ Rails 2

request.url





3

คุณสามารถใช้

request.original_url 

หรือ

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

เพื่อรับ URL ปัจจุบัน



1

คุณสามารถตั้งค่าตัวแปรเป็นURI.parse(current_url)ฉันยังไม่เห็นข้อเสนอนี้ที่นี่และมันใช้งานได้สำหรับฉัน


0

ในการรับ URL ที่สมบูรณ์ซึ่งหมายความว่าfrom the rootสามารถแสดงได้เช่นนี้

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

ผู้ใช้ users_url สร้าง URL ที่มีโปรโตคอลและชื่อโฮสต์ ผู้ใช้ users_path สร้างส่วนของเส้นทางเท่านั้น

users_url: http://localhost/users
users_path: /users
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.