Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?


回答:


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の使用は非推奨です。代わりにフルパスを使用してください
giladbu

9
@giladbu fullpathはプロトコル/ドメイン/ポートを含みません!絶対URLではありません!
アランH.11年

37
"http://#{request.host+request.fullpath}"動作するかどうか、(ポートが重要な場合)"http://#{request.host}:#{request.port+request.fullpath}"
Nilloc

7
ポートが重要な場合は、この1つは右の作品: "http://#{request.host}:#{request.port}#{request.fullpath}"
Sucrenoir

3
request.url廃止された申し立ての参照を指摘できますか?提案された解決策は、request.urlすでに何をしているのかを示す長い道のりです。実装は、単純にプロトコル+ host_with_port +フルパス(github.com/rails/rails/blob/…)です
mhartl

134

Ruby on Rails 3.0メソッドは今だと思いますrequest.fullpath


13
フルパスにドメインが含まれていません
lulalala 2013年

ドメインを含めない方法を実際に検索していたので、これが提供されてうれしいです。
ジェイク

121

あなたは使うことができます url_for(only_path: false)


私の(少し特殊なケース)では、これはほぼまさに私が欲しかったものでした。オプションをtrueに変更し、オプションなしで現在のページのURLを取得しました。ありがとう:)
Spiralis

@Davidはビューにありません。しかし、とにかくそこで使用すべきではありません=)
Lyuben Todorov

私の場合、ホスト名を変更し、それ以外はすべて保持したいと考えました。この問題の解決策として、url_for(host: 'www.newdomain.com')が最適であることがわかりました。IMOは、レールのすべてのバージョンで同じであるため、より堅牢なソリューションです。
PeppyHeppy

1
同じリソースに複数のパスがある場合、これは機能しません。
thekingoftruth 2014

68

サポート終了の警告:#request_uriの使用は廃止されました。代わりにフルパスを使用してください。


4
回答の注意事項を参照してくださいstackoverflow.com/a/2165727/166279を、フルパスドメインが含まれていません。
Nilloc、2012

この行は、使用時の執筆時のログから直接得られたものでありrequest.uri、この質問ですでに何度か指摘されていますが... OK、ありがとう
ecoologic

1
@ManishShrivastava:おかしい、私はより複雑な質問に答える置くすべての「オリジナル」の努力にもかかわらず、このコピー&ペーストは私に何もないよりも...優れた最高のスコアを与えた
ecoologic


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では定義されていないようです。
アランH.

1
あなたは、このようにそれを行うことができますurl_for params.merge(:format => "PDF", :only_path => false)
montrealmike

2
また、あなたがいる場合は、link_to使用params.mergeしてurl_for完全にスキップすることができます
モントリオールマイク2012

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
はいハイメの答えははるかに優れていますが、本当に非効率的になりたい場合は、私の方法でそれを行うことができます。
ジェームズM


13

Ruby 1.9.3-p194およびRuby on Rails 3.2.6の使用:

request.fullpathが機能しない場合は、request.env ["HTTP_REFERER"]を試してください

以下が私の話です。

たとえば、さまざまなコントローラーからの情報を組み合わせた累積ページの現在のURL(ユーザーのブラウザーのアドレスバーに表示されます)を検出すると、同様の問題が発生しましたhttp://localhost:3002/users/1/history/issues

ユーザーは、問題の種類の異なるリストに切り替えることができます。これらすべてのリストは、Ajaxを介してさまざまなコントローラー/部分からロードされます(リロードなし)。

問題は、リストの各アイテムで[戻る]ボタンの正しいパスを設定して、[戻る]ボタンが独自のページと累積ページ履歴の両方で正しく機能するようにすることでした。

request.fullpathを使用する場合は、最後のJavaScriptリクエストのパスを返しますが、これは探している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を取得します。あなたがどこから来たのかではなく、これも私が必要としたものです。これをありがとう!
Spencer Rathbun 2012

2
私が必要とするものだけでうまく機能します。ただし、これは別の質問と回答にする必要があります。ここで見つけるのは難しい。:/
DDDD 2014


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

rubyメソッドを使用できます。

:root_url

これは、ベースURLを含む完全なパスを取得します。

localhost:3000/bla

これはRailsの4にactive_model_serializersを使用してシリアライザで働く唯一のソリューションです
クリスKhaira

絶対URL :root_urlを取得するために何かを使用するときに、渡すURLを絶対URLに制限する方法を教えてください。私はのようなのsomethinをusinだと仮定some_method(:products_brand_url, brand: brand, entity_name: "brand")し、some_method私のような表情に私のルートを望んでいない`デフsome_method(ルート、OPTS = {})最後`として定義されています- http://localhost:3000/brands/brand_name?&entity_name="brand"。ルートを次のようにしたいですhttp://localhost:3000/brands/brand_name。私entity_nameは、絶対URLのパラメータとしてではなく、optsハッシュの一部にしたいだけです。
boddhisattva 2017

確かに、というRubyメソッドはありません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}"

6

Rails 4.0

あなたが使用することができrequest.original_url、出力は以下の例のようになります

get "/articles?page=2"

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

4

Rails 3.2またはRails 4の場合 このようにして、「request.original_url」リファレンスを取得します。参照:元のURLメソッド

Rails 3の 場合request.urlは非推奨です。連結することで絶対パスを取得できます

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

Rails 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

from the rootこのように表示できることを意味する絶対URLを取得するには

<%= 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.