ฉันจะรับURL สัมบูรณ์ในมุมมอง Ruby on Rails ของฉันได้อย่างไร
request.request_uri
ส่งกลับเฉพาะญาติURL
ฉันจะรับURL สัมบูรณ์ในมุมมอง Ruby on Rails ของฉันได้อย่างไร
request.request_uri
ส่งกลับเฉพาะญาติURL
คำตอบ:
คุณควรใช้request.original_url
เพื่อรับ URL ปัจจุบัน
วิธีนี้ได้รับการบันทึกไว้ที่วิธี original_urlแต่หากคุณสงสัยการใช้งานคือ:
def original_url
base_url + original_fullpath
end
คุณสามารถเขียน"#{request.protocol}#{request.host_with_port}#{request.fullpath}"
ได้เนื่องจากrequest.url
ขณะนี้เลิกใช้แล้ว
คุณสามารถเขียนแทนrequest.url
request.request_uri
วิธีนี้รวมโปรโตคอล (โดยปกติคือ http: //) กับโฮสต์และ request_uri เพื่อให้ที่อยู่แบบเต็มแก่คุณ
fullpath
ไม่รวมถึงโปรโตคอล / โดเมน / พอร์ต! ไม่ใช่ URL ที่สมบูรณ์!
"http://#{request.host+request.fullpath}"
จะทำงานหรือมิฉะนั้น (ถ้าพอร์ตมีความสำคัญ)"http://#{request.host}:#{request.port+request.fullpath}"
"http://#{request.host}:#{request.port}#{request.fullpath}"
request.url
เลิกใช้แล้วได้หรือไม่? วิธีแก้ปัญหาที่เสนอเป็นเพียงวิธีที่ยาวในการพูดในสิ่งที่request.url
ทำไปแล้ว การใช้งานเป็นเพียงโปรโตคอล + host_with_port + fullpath ( github.com/rails/rails/blob/
คุณสามารถใช้ url_for(only_path: false)
คัดค้านคำเตือน: การใช้ #request_uri จะเลิก ใช้ fullpath แทน
request.uri
และสิ่งนี้ได้ชี้ให้เห็นแล้วหลายครั้งในคำถามนี้ แต่ ... ตกลงขอบคุณ
หากคุณใช้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
คุณสามารถเพิ่มเมธอด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
url_for params.merge(:format => "PDF", :only_path => false)
link_to
คุณก็สามารถใช้params.merge
และข้ามurl_for
โดยสิ้นเชิง
สำหรับ Ruby on Rails 3:
request.url
request.host_with_port
ฉันเปิดเซสชันดีบักเกอร์และสอบถามวัตถุคำขอ:
request.public_methods
ใน Ruby on Rails 3.1.0.rc4:
request.fullpath
fullpath
ไม่ได้ให้ข้อมูลabsolute URL
ตามที่ผู้ลงประกาศดั้งเดิมร้องขอ
ฉันต้องการURLแอปพลิเคชันแต่มีไดเรกทอรีย่อย ฉันใช้:
root_url(:only_path => false)
url_for(params)
และคุณสามารถเพิ่มพารามิเตอร์ใหม่ได้อย่างง่ายดาย:
url_for(params.merge(:tag => "lol"))
ฉันคิดว่า request.domain จะทำงานได้ แต่ถ้าคุณอยู่ในไดเรกทอรีย่อยเช่น blah.blah.com สิ่งนี้สามารถใช้งานได้:
<%= request.env["HTTP_HOST"] + page = "/" + request.path_parameters['controller'] + "/" + request.path_parameters['action'] %>
เปลี่ยนพารามิเตอร์ตามโครงสร้างพา ธ ของคุณ
หวังว่าจะช่วย!
ดูเหมือนว่าrequest_uri
เลิกใช้แล้วใน Ruby on Rails 3
Using #request_uri is deprecated. Use fullpath instead.
การใช้ 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
ใช้งานได้กับ Ruby on Rails 3.0 และควรได้รับการสนับสนุนจาก Ruby on Rails เกือบทุกรุ่น
request.env['REQUEST_URI']
ไม่มีคำแนะนำในหัวข้อนี้ที่ช่วยให้ฉันเศร้านอกจากที่ใครบางคนบอกว่าเขาใช้ดีบักเกอร์เพื่อค้นหาสิ่งที่เขามองหา
ฉันได้สร้างบางหน้าข้อผิดพลาดที่กำหนดเองแทนมาตรฐาน 404 และ 500 แต่request.url
จบลงด้วยการแทนความคาดหวัง/404
/non-existing-mumbo-jumbo
สิ่งที่ฉันต้องการใช้คือ
request.original_url
request.domain
ถ้าโดยญาติคุณหมายถึงเพียงโดยไม่ต้องโดเมนแล้วมองเข้าไปใน
(url_for(:only_path => false) == "/" )? root_url : url_for(:only_path => false)
คุณสามารถใช้วิธี ruby:
:root_url
ซึ่งจะได้รับเส้นทางแบบเต็มพร้อม URL พื้นฐาน:
localhost:3000/bla
: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 แบบสัมบูรณ์
root_url
วิธีการที่เรียกว่า
ใน Rails 3 คุณสามารถใช้
request.original_url
http://apidock.com/rails/v3.2.8/ActionDispatch/Request/original_url
คุณสามารถใช้อันใดอันหนึ่งสำหรับราง 3.2:
request.original_url
or
request.env["HTTP_REFERER"]
or
request.env['REQUEST_URI']
ฉันคิดว่ามันจะทำงานทุกที่
"#{request.protocol}#{request.host}:#{request.port}#{request.fullpath}"
Rails 4.0
คุณสามารถใช้งานrequest.original_url
ได้ผลลัพธ์ดังตัวอย่างด้านล่าง
get "/articles?page=2"
request.original_url # => "http://www.example.com/articles?page=2"
สำหรับ 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
ถ้าคุณต้องการเจาะจงความหมายคุณรู้เส้นทางที่คุณต้องการ:
link_to current_path(@resource, :only_path => false), current_path(@resource)
สำหรับราง 3:
request.fullpath
request.env["REQUEST_URI"]
ทำงานในราง 2.3.4 ทดสอบแล้วและไม่ทราบเกี่ยวกับรุ่นอื่น
เพื่อรับ URL คำขอโดยไม่มีพารามิเตอร์การสืบค้นใด ๆ
def current_url_without_parameters
request.base_url + request.path
end
คุณสามารถใช้
request.original_url
หรือ
"#{request.protocol}#{request.host_with_port}"
เพื่อรับ URL ปัจจุบัน
คุณสามารถใช้ได้:
request.full_path
หรือ
request.url
หวังว่ามันจะช่วยแก้ปัญหาของคุณ
ไชโย
คุณสามารถตั้งค่าตัวแปรเป็นURI.parse(current_url)
ฉันยังไม่เห็นข้อเสนอนี้ที่นี่และมันใช้งานได้สำหรับฉัน
ในการรับ URL ที่สมบูรณ์ซึ่งหมายความว่าfrom the root
สามารถแสดงได้เช่นนี้
<%= link_to 'Edit', edit_user_url(user) %>
ผู้ใช้ users_url สร้าง URL ที่มีโปรโตคอลและชื่อโฮสต์ ผู้ใช้ users_path สร้างส่วนของเส้นทางเท่านั้น
users_url: http://localhost/users
users_path: /users