url_for

オブジェクトからルーティングを取得する。

@user = User.find(2)
url_for(@user)
# => "/users/2"

コントローラー内もしくはビュー内から呼び出す場合は controller の指定を省略できる。

url_for(action: "edit", id: 2)
# => "/users/2/edit"

参考:

link_to, url_for 違い、まとめ – Qiita

オブジェクトからパスとURLを作成する | Rails ガイド [公式]

url_for – ActionDispatch::Routing::UrlFor | Ruby on Rails API [Official]

rails/routing_url_for.rb at v5.2.2 · rails/rails – GitHub

パラメータ付きで url_helpers を使う

参考:

link_to で任意のリクエストパラメータを渡す – Qiita

Rails の link_to にパラメータを付与する | MogLog

link_to メソッドを使ったリンクの作成 | Ruby on Rails 入門

How to use Rails named route helpers with parameters? – Stack Overflow

Rails passing params to new action – Stack Overflow

コントローラー内で url_helpers を使う

Rails.application.routes.url_helpersinclude する。

include Rails.application.routes.url_helpers

redirect_to root_url

もしくは、変数に代入して参照する。

routes = Rails.application.routes.url_helpers

redirect_to routes.users_url

users_link = link_to("Users", routes.users_path)

参考:

Controller など View 以外から url_helpers (_url, _path) を呼ぶ – Qiita

controller, view 以外から url_for を呼ぶ – Qiita

ActiveJob から url_helper を呼ぶ – Qiita

How to access URL helper from rails module – Stack Overflow

url_helpers の使い分け

コントローラー内でリダイレクトする場合は *_url 形式のヘルパーを使う。(エンジン毎に別ドメインで運用していた場合などに、ドメインやプロトコルを含めたフルの URL で正しくリダイレクトする。)

redirect_to root_url

ビューでリンクを生成する場合は *_path 形式のヘルパーを使う。(同じドメイン内へのリンクをパスのみで生成する。)

<%= link_to "Products", products_path %>

参考:

_path メソッドと _url メソッドの使い分け – Qiita

Rails の *_path と *_url に関するメモ | $ cat /var/log/shin

エンジンの url_helpers を参照する

url_helpers を使いたいところでエンジン内の Engine モジュールの routes.url_helpersinclude する。

include MyEngine::Engine.routes.url_helpers

redirect_to users_url

users_link = link_to("Users", users_path)

もしくは、url_helpers を変数に代入して参照する。

routes = MyEngine::Engine.routes.url_helpers

redirect_to routes.admin_url

admin_link = link_to("Admin", routes.admin_path)

参考:

マウントしたエンジンとメインのアプリ間でのアクセス – Qiita

engine の routing を application 側から path で呼び出す – Qiita

Rails.application.routes.url_for doesn’t find routes for engine · Issue #6389 · rails/rails – GitHub

Named routes in mounted rails engine – Stack Overflow

Using the correct url_for method in a Rails engine spec – Stack Overflow

コントローラーで含めるヘルパーを指定する

参考:

helper – AbstractController::Helpers::ClassMethods | Ruby on Rails API [Official]

How can I access Rails mountable engine helper method in main app? – Stack Overflow

Why is my Rails mountable engine not loading helper methods correctly? – Stack Overflow

名前空間の異なるモジュールにヘルパーを含める

参考:

Mountable Engine から application_helper が使えない – Qiita

名前付きルーティングの一覧を確認する

Rails.application.routes.named_routes.names

参考:

names – rails/route_set.rb at v5.2.2 · rails/rails – GitHub

定義されているヘルパーの一覧を確認する

Rails.application.routes.named_routes.helper_names

参考:

helper_names – rails/route_set.rb at v5.2.2 · rails/rails – GitHub

RoutesInspector

inspector = ActionDispatch::Routing::RoutesInspector.new(
  Rails.application.routes.routes
)
formatter = ActionDispatch::Routing::ConsoleFormatter.new

inspector.format(formatter)

参考:

rails/inspector.rb at v5.2.2 · rails/rails – GitHub

rails/routes_command.rb at v6.0.0.beta1 · rails/rails – GitHub

default_url_options

参考:

Rails と関係ないところで ActiveStorage の URL を生成する | コード日進月歩

Rails で Missing host to link to! が出たときに。model 内で URL 組み立てる場合の設定 – Qiita

rails の model で ***_path (resource の URL) を使う方法 | lxyuma BLOG

ActionMailer で Helper を呼び出すとエラーになる – Qiita

host parameter 周りのエラーが解決できません。- teratail

ActionView::Template::Error: Missing host to link to – Stack Overflow

url_for not using default_url_options[:host] value – Stack Overflow

Setting default_url_options in test environment doesn’t seem to work – Stack Overflow

host

参考:

Full URL with url_for in Rails – Stack Overflow

subdomain

参考:

Rails でカスタムサブドメイン | motolog

url_helpers をモジュール化する

参考:

how to use url helpers in lib modules, and set host for multiple environments – Stack Overflow

JavaScript ファイルで URL ヘルパーを使う (ERB)

参考:

How do I construct an absolute URL in a js.erb file? – Stack Overflow

host

参考:

Rails 4 url_for with host constraint – Stack Overflow

format

リクエストのフォーマットを指定する。

Ajax で JavaScript ファイル (.js) を明示的にリクエストしたい場合は URL ヘルパーのオプションに format: :js を指定する。

<%= link_to "Get JS via Ajax", ajax_path(format: :js), remote: true %>

パフォーマンス

参考:

Rails の url_helper の速度低下を防ぐコツ 翻訳 | TechRacho

A Better Time with Rails url_helpers | Kitty Con Gato

Rails’s url_for weaknesses | Rails Guides

URL ヘルパーのエラー

*_url 形式の URL ヘルパーを使用した際に、ArgumentError もしくは、テンプレート内の場合は ActionView::Template::Error が発生する。

ActionView::Template::Error: Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true

原因

URL ヘルパーに host パラメータを渡しておらず、default_url_optionshost が設定されていない。

対処法

routes の default_url_options を設定する。

Rails.application.routes.default_url_options[:host] = "example.com"

エンジンの場合は、

MyEngine::Engine.routes.default_url_options[:host] = "example.com"

参考:

full_url_for – rails/url.rb at v5.2.3 · rails/rails – GitHub

ActionView::Template::Error: Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true – Stack Overflow

記事をシェアする:
タグ:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Protected by reCAPTCHA