රූබි ඔන් රේල්ස් හි වර්තමාන නිරපේක්ෂ URL එක ලබා ගන්නේ කෙසේද?


1059

මගේ රූබි ඔන් රේල්ස් දර්ශනයේ වත්මන් නිරපේක්ෂ URL ලබා ගන්නේ කෙසේද ?

මෙම request.request_uriපමණක් සාපේක්ෂ නැවත URL එක .


ඔබට රේල් පීලි 4 ක් බැලීමට හැකිය: blog.grepruby.com/2015/04/absolute-url-full-url-in-rails-4.html
user3118220

Answers:


1449

රේල්ස් 3.2 හෝ රේල්ස් 4+ සඳහා

request.original_urlවත්මන් URL ලබා ගැනීමට ඔබ භාවිතා කළ යුතුය .

මෙම ක්‍රමය original_url ක්‍රමයේදී ලේඛනගත කර ඇත , නමුත් ඔබ කුතුහලයෙන් සිටී නම්, ක්‍රියාත්මක කිරීම:

def original_url
  base_url + original_fullpath
end

රේල් 3 සඳහා:

දැන් අතහැර දමා ඇති "#{request.protocol}#{request.host_with_port}#{request.fullpath}"බැවින් ඔබට ලිවිය හැකිය request.url.


රේල් පීලි 2 සඳහා:

request.urlඒ වෙනුවට ඔබට ලිවිය හැකිය request.request_uri. මෙය ප්‍රොටෝකෝලය (සාමාන්‍යයෙන් http: //) ධාරකය සමඟ ඒකාබද්ධ කරන අතර ඔබට සම්පූර්ණ ලිපිනය ලබා දීමට request_uri.


31
වෙනත් පරිශීලකයින් පෙන්වා දුන් පරිදි: අවප්‍රමාණ අනතුරු ඇඟවීම: #request_uri භාවිතා කිරීම අවලංගු කර ඇත. ඒ වෙනුවට ෆුල්පාත් භාවිතා කරන්න
giladbu

9
@giladbu fullpathහි ප්‍රොටෝකෝලය / වසම / වරාය ඇතුළත් නොවේ! එය නිරපේක්ෂ URL එකක් නොවේ!
ඇලන් එච්.

37
"http://#{request.host+request.fullpath}"(වරාය වැදගත් නම්)"http://#{request.host}:#{request.port+request.fullpath}"
නිලෝක්

7
වරාය වැදගත් නම්, මෙය නිවැරදිව ක්‍රියාත්මක වේ: "http://#{request.host}:#{request.port}#{request.fullpath}"
සුක්‍රෙනොයර්

3
request.urlඅවලංගු කරන ලද හිමිකම් පෑම සඳහා යොමු කිරීමක් ඔබට යොමු කළ හැකිද ? යෝජිත විසඳුම request.urlදැනටමත් කරන දේ කීමට බොහෝ දුරක් පමණි ; ක්‍රියාත්මක කිරීම හුදෙක් ප්‍රොටෝකෝලය + host_with_port + fullpath ( github.com/rails/rails/blob/… )
mhartl

135

මම හිතන්නේ රූබි ඔන් රේල්ස් 3.0 ක්‍රමය දැන් request.fullpath.


13
ෆුල්පාත්හි වසම ඇතුළත් නොවේ
ලුලාලාල

වසම ඇතුළත් නොකරන්නේ කෙසේදැයි මම සැබවින්ම සොයමින් සිටියදී මෙය ලබා දීම ගැන මම සතුටු වෙමි.
ජේක්

124

ඔබට භාවිතා කළ හැකිය url_for(only_path: false)


මගේ (ටිකක් විශේෂ අවස්ථාවක) මෙය හරියටම මට අවශ්‍ය දේම විය. මම විකල්පය සත්‍ය ලෙස වෙනස් කර විකල්පයක් නොමැතිව වත්මන් පිටුව සඳහා යූආර්එල් ලබා ගතිමි. ස්තූතියි :)
ස්පිරලිස්

Av ඩේවිඩ් එය දර්ශනයේ නොමැත. නමුත් එය කෙසේ හෝ එහි භාවිතා කළ should'n =)
Lyuben Todorov

මගේ නඩුවේදී මට අවශ්‍ය වූයේ සත්කාරක නාමය වෙනස් කිරීමට නමුත් අනෙක් සියල්ල තබා ගැනීමටයි. Url_for (සත්කාරක: 'www.newdomain.com') ගැටලුවට විසඳුමක් ලෙස මට වඩාත්ම සුදුසු බව මට පෙනී ගියේය. රේල් පීලි වල සෑම අනුවාදයකටම සමාන වන බැවින් වඩාත් ශක්තිමත් විසඳුමක් වන IMO.
PeppyHeppy

1
FYI ඔබට එකම සම්පතක් සඳහා විවිධ මාර්ග තිබේ නම් මෙය ක්‍රියා නොකරනු ඇත.
thekingoftruth

68

අවලංගු කිරීමේ අවවාදය: #request_uri භාවිතා කිරීම අවලංගු කර ඇත . ඒ වෙනුවට ෆුල්පාත් භාවිතා කරන්න.


4
පිළිතුර stackoverflow.com/a/2165727/166279 හි සටහන් බලන්න , ෆුල්පාත්හි වසම ඇතුළත් නොවේ.
නිල්ලොක්

මෙම රේඛාව භාවිතා කරන විට ලිවීමේ වේලාවේදී request.uri
ලොගයෙන්

1
An මනීෂ් ශ්‍රිවාස්ටාව: විහිලු, මම වඩාත් සංකීර්ණ ප්‍රශ්න වලට පිළිතුරු සැපයූ සියලු “මුල්” උත්සාහයන් නොතකා, මෙම පිටපත හා පේස්ට් මට ඉහළම ලකුණු ලබා දුන්නේය, හොඳයි ...
සියල්ලටම

61

ඔබ රේල්ස් 3.2 හෝ රේල්ස් 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

වත්මන් URL ය නැවත ලබා දීමට සහ වෙනත් පරාමිතීන් සමඟ ඒකාබද්ධ වීමට ඉඩ දීම සඳහා ඔබට මෙම වත්මන්_උර්ල් ක්‍රමය ApplicationController හි එක් කළ හැකිය

# 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
රේල් පීලි 3.1 හි මෙය අර්ථ දක්වා ඇති බවක් නොපෙනේ.
ඇලන් එච්.

1
ඔබට එය මේ ආකාරයෙන් කළ හැකියurl_for params.merge(:format => "PDF", :only_path => false)
montrealmike

2
එසේම ඔබ සිටින්නේ නම් ඔබට සම්පූර්ණයෙන්ම link_toභාවිතා params.mergeකර මඟ හැරිය හැකurl_for
montrealmike

36

රූබි ඔන් රේල්ස් 3 සඳහා:

request.url
request.host_with_port

මම නිදොස් කිරීමේ සැසියක් ඉවත් කර ඉල්ලීම් වස්තුව විමසුවෙමි:

request.public_methods


28

මට යෙදුම් URL අවශ්‍ය නමුත් උප බහලුම සමඟ. මම භාවිතා කළේ:

root_url(:only_path => false)


16

මම හිතන්නේ request.domain වැඩ කරයි, නමුත් ඔබ blah.blah.com වැනි උප නාමාවලියක සිටී නම් කුමක් කළ යුතුද? මේ වගේ දෙයක් වැඩ කරන්න පුළුවන්:

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

ඔබේ මාර්ග ව්‍යුහය මත පදනම්ව පරාමිතීන් වෙනස් කරන්න.

උපකාරවත් වන බලාපොරොත්තුව!


8
ඔව්, ජයිම්ගේ පිළිතුර වඩා හොඳය, නමුත් ඔබට ඇත්තටම අකාර්යක්ෂම වීමට අවශ්‍ය නම්, ඔබට එය මගේ ආකාරයට කළ හැකිය.
ජේම්ස් එම්

14

එය වගේ request_uriරේල් පීලි 3 දා රූබි ප්රතික්ෂේප කරයි.

Using #request_uri is deprecated. Use fullpath instead.

13

රූබි 1.9.3-පි 194 සහ රූබි ඔන් රේල්ස් 3.2.6 භාවිතා කිරීම:

Request.fullpath ඔබ වෙනුවෙන් ක්‍රියා නොකරන්නේ නම්, request.env උත්සාහ කරන්න ["HTTP_REFERER"]

මෙන්න මගේ කතාව පහතින්.

විවිධ පාලකයන්ගේ තොරතුරු ඒකාබද්ධ කරන සමුච්චිත පිටු සඳහා වත්මන් URL (ඇගේ බ්‍රව්සරයේ පරිශීලකයා සඳහා ලිපින තීරුවේ පෙන්වා ඇත) සොයා ගැනීමේදී මට සමාන ගැටළුවක් ඇතිවිය http://localhost:3002/users/1/history/issues.

පරිශීලකයාට විවිධ ආකාරයේ ගැටළු ලැයිස්තුවකට මාරු විය හැකිය. එම ලැයිස්තු සියල්ලම විවිධ පාලක / කොටස් වලින් (නැවත පූරණය නොකර) අජැක්ස් හරහා පටවනු ලැබේ.

ගැටළුව වූයේ ලැයිස්තුවේ සෑම අයිතමයකම පිටුපස බොත්තම සඳහා නිවැරදි මාර්ගය සැකසීමයි, එවිට පිටුපස බොත්තම එහි පිටුවේ මෙන්ම සමුච්චිත පිටු ඉතිහාසයේද නිවැරදිව ක්‍රියා කළ හැකිය .

මම request.fullpath භාවිතා කරන්නේ නම් , එය අවසාන ජාවාස්ක්‍රිප්ට් ඉල්ලීමේ මාවත ලබා දෙයි, එය නියත වශයෙන්ම මා සොයන URL නොවේ.

එබැවින් මම නැවත පූරණය කළ ඉල්ලීමේ URL එක ගබඩා කරන request.env ["HTTP_REFERER"] භාවිතා කළෙමි .

තීරණයක් ගැනීම සඳහා අර්ධ වශයෙන් උපුටා ගැනීමක් මෙන්න

- 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

ඔව්, ෆුල්පාත් ඔබට ලැබෙන්නේ ඔබ ඉල්ලූ url එක මිස ඔබ පැමිණි url එක නොවේ, එය මටද අවශ්‍ය විය. මේ සඳහා ස්තූතියි!
ස්පෙන්සර් රාත්බන්

2
මට අවශ්‍ය දේ පමණක්ම විශිෂ්ටයි. මෙය වෙනමම ප්‍රශ්නයක් හා පිළිතුරක් විය යුතුය. කරුණාව මෙතන හොයාගන්න අමාරුයි. : /
DDDD

12

මෙය රූබි ඔන් රේල්ස් 3.0 සඳහා ක්‍රියා කරන අතර රූබි ඔන් රේල්ස් හි බොහෝ සංස්කරණ මඟින් සහාය විය යුතුය:

request.env['REQUEST_URI']

11

මෙම ත්‍රෙඩ් එකේ ඇති කිසිම යෝජනාවක් මට කණගාටුවට කරුණක් නොවීය, යමෙකු ඔහු නිදොස් කොටුව භාවිතා කර ඔහු සොයන දේ සොයා ගැනීමට භාවිතා කළ බව හැරෙන්නට.

මම සම්මත 404 සහ 500 වෙනුවට අභිරුචි දෝෂ පිටු කිහිපයක් නිර්මාණය කර ඇත්තෙමි, නමුත් අපේක්ෂිත වෙනුවට එය request.urlඅවසන් විය ./404/non-existing-mumbo-jumbo

මට භාවිතා කිරීමට අවශ්‍ය වූයේ එයයි

request.original_url

9

සාපේක්ෂ වශයෙන්, ඔබ අදහස් කරන්නේ වසම නොමැතිව නම්, ඒ ගැන සොයා බලන්න request.domain.


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

8

ඔබට රූබි ක්‍රමය භාවිතා කළ හැකිය:

:root_url

එමඟින් මූලික url සමඟ සම්පූර්ණ මාර්ගය ලැබෙනු ඇත:

localhost:3000/bla

රේල්ස් 4 හි සක්‍රිය_මොඩල්_සීරියලයිසර් භාවිතා කරමින් අනුක්‍රමිකව ක්‍රියා කරන එකම විසඳුම මෙයයි
ක්‍රිස් කයිරා

නිරපේක්ෂ යූආර්එල් :root_urlලබා ගැනීමට මා කැමති දෙයක් භාවිතා කරන විට නිරපේක්ෂ යූආර්එල් වෙත මා යොමු කරන පරාමිතීන් සීමා කරන්නේ කෙසේදැයි කරුණාකර මට කියන්න පුළුවන්ද ? මම යම් තරමකට සමාන යැයි උපකල්පනය some_method(:products_brand_url, brand: brand, entity_name: "brand")කර some_methodඑය අර්ථ දක්වනුයේ `def some_method (මාර්ගය, opts = {}) end` මගේ ගමන් මාර්ගය පෙනෙන්නට මා කැමති නැත - http://localhost:3000/brands/brand_name?&entity_name="brand". මට මාර්ගය පෙනෙන්නට අවශ්‍යයි http://localhost:3000/brands/brand_name. මට අවශ්‍ය entity_nameවන්නේ එය නිරපේක්ෂ url හි පරාමිතීන් ලෙස නොව ඔප්ට්ස් හැෂ් හි කොටසක් වීමයි.
boddhisattva

නිසැකවම රූබි ක්‍රමයක් නැත root_url.
ස්මයිලාර්ට්


6

රේල් පීලි සඳහා ඔබට ඕනෑම එකක් භාවිතා කළ හැකිය 3.2:

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

මම හිතන්නේ එය සෑම තැනකම ක්‍රියාත්මක වේවි

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

6

රේල් පීලි 4.0

ඔබට භාවිතා කළ හැකිය request.original_url, ප්‍රතිදානය පහත උදාහරණයෙන් දැක්වේ

get "/articles?page=2"

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

4

රේල් පීලි 3.2 හෝ රේල්ස් 4 සඳහා සරලවම මේ ආකාරයට පිවිසෙන්න "request.original_url" යොමුව: මුල් URL ක්‍රමය

රේල් පීලි 3 සඳහා request.url අතහැර දමා ඇත. අපට සමෝධානික වීමෙන් නිරපේක්ෂ මාර්ගයක් ලබා ගත හැකිය

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

රේල් පීලි 2 සඳහා

request.url

3

ඔබට නිශ්චිත, අර්ථයක් වීමට අවශ්‍ය නම්, ඔබට අවශ්‍ය මාර්ගය ඔබ දන්නවා:

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



3

විමසුම් පරාමිතීන් නොමැතිව ඉල්ලීම් URL ලබා ගැනීම.

def current_url_without_parameters
  request.base_url + request.path
end

3

ඔබට භාවිතා කළ හැකිය

request.original_url 

හෝ

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

වත්මන් URL ලබා ගැනීමට.


1

ඔයාට පාවිච්චි කරන්න පුළුවන්:

request.full_path

හෝ

request.url

එය ඔබගේ ගැටලුව විසඳනු ඇතැයි බලාපොරොත්තු වෙමු.

චියර්ස්


1

ඔබට විචල්‍යයක් සැකසිය හැකිය URI.parse(current_url), මම තවමත් මෙම යෝජනාව මෙහි නොදකින අතර එය මට වැඩ කරයි.


0

නිරපේක්ෂ URL ලබා ගැනීම සඳහා from the rootඑය මේ ආකාරයෙන් පෙන්විය හැකිය

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

User_url උදව්කරු විසින් ප්‍රොටෝකෝලය සහ ධාරක නාමය ඇතුළත් URL එකක් ජනනය කරයි. User_path සහායකයා ජනනය කරන්නේ මාර්ග කොටස පමණි.

users_url: http://localhost/users
users_path: /users
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.