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_helpers
を include
する。
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_helpers
を include
する。
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
参考:
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_options
に host
が設定されていない。
対処法:
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