リンクするホストがありません!:hostパラメータを指定するか、default_url_options [:host]を設定してください


183

私は今、約90分間グーグルしてきましたが、まだこれに対する答えはありません。どこに設定しdefault_url_optionsますか?config.action_mailer.default_url_optionsこれと同じバグを別の場所で解決するように設定しましたが、RSpec仕様内でURLヘルパーを使用しようとすると、このエラーが発生します。default_url_optionsが設定されることを期待している場所がわかりません。

 Failure/Error: listing_url(listing).should match(/\/\d+-\w+$/)
 RuntimeError:
   Missing host to link to! Please provide :host parameter or set default_url_options[:host]
 # ./spec/routing/listing_routing_spec.rb:9:in `block (3 levels) in <top (required)>'

このコードはemails / ActionMailerとは関係がなく、たまたまパスではなくURLが必要なだけです。

何か案は?


とにかくホストは何ですか?
Jwan622 2016

回答:


260

すべての環境で次の行を追加する必要があります。

config.action_mailer.default_url_options = { :host => "yourhost" }

そうすれば、すべての環境で機能し、環境ごとに異なる可能性があります。例えば:

development.rb

config.action_mailer.default_url_options = { :host => "dev.yourhost.com" }

test.rb

config.action_mailer.default_url_options = { :host => "test.yourhost.com" }

production.rb

config.action_mailer.default_url_options = { :host => "www.yourhost.com" }

16
また、これを追加した後は、必ずRailsサーバーを再起動してください。config /の下のファイルは自動的に再ロードされません。
Stenerson 2013

3
私はこれと非常に似ていますが、action_mailerのdefault_url_optionを設定しても効果がありません。ユースケースは次のようである:(2)Rails.application.routes.url_helpers.message_image_url
Boti

1
これをやりましたか 本番環境でホスト名の前にwww ...を付けても付けなくても、同じエラーが発生します。@ d11wtqごとにルートを追加しました。この動作を引き起こしたRails4の変更はありますか?それ以来、私はアップグレードの前にそれを見たことはなく、特定の1つのメール送信(考案自動化)でしか見ていません。
JosephK 2014年

これが私のRails 4プロジェクトでは機能しないことを確認できます。ルートにそれを設定することは単にオプションではありません。
b1nary 2016年

4
レール5.追加で動作していないdefault_url_options Rails.application.config.action_mailer.default_url_optionsものの、別のコメンターにより示唆されるようにそれは、トリックをした
BooBailey

74
Your::Application.routes.draw do
  default_url_options :host => "example.com"

  # ... snip ...
end

どこかにroutes.rb:)


35
異なるURLを持つ多くの異なる環境がある場合は、あまり良くありません
Neil Middleton

2
複数のenvドメインがある場合はどうしますか?
wejrowski

おそらく、代わりに、ルートマップまたはURLヘルパーの呼び出しで、URLごとに指定するだけですlisting_url(listing, :host => "whatever.com")
d11wtq

14
それぞれの環境の構成ファイルで、このカスタムオプションを追加しますconfig.domain = 'staging.myapp.com'(もちろん、各環境の正しいドメイン名に置き換えます)。その後、routes.rb私は自由に使用できdefault_url_options host: Rails.application.config.domain、どの環境でも動作します。どういたしまして。
Prathan Thananart 2012

10
より良い方法は、routesファイル内で次のようにすることですdefault_url_options Rails.application.config.action_mailer.default_url_options
siannopollo 14年

42

ホストは、各環境の構成ファイルで指定する必要があります。例えば:

config/environments/development.rb

この質問この質問を参照してください。


4
routes.drawおかげで、私見これはという答えよりも良い答えである用途
joelparkerhenderson

1
この回答は、異なるドメインを使用する場合には役立ちませんし、他の問題に対処します。
ライアン

1
@ライアンは、環境変数を使用してそれを修正することができます
コートシマ、

35

default_url_optionsを使用するように設定しますaction_mailer.default_url_options

各環境ファイル(、など)development.rbproduction.rbdefault_url_options使用するを指定できますaction_mailer

config.action_mailer.default_url_options = { host: 'lvh.me', port: '3000' }

ただし、これらは以下に対して設定されていませんMyApp:Application.default_url_options

$ MyApp::Application.config.action_mailer.default_url_options
#=> {:host=>"lvh.me", :port=>"3000"}

$ MyApp::Application.default_url_options
#=> {}

そのため、以外の場所でエラーが発生していますActionMailer

あなたは、あなたのアプリケーションの設定することができますdefault_url_optionsあなたのために定義されたものを使用してaction_mailer、適切な環境ファイル(中development.rbproduction.rbなど)。

できる限り乾燥した状態に保つには、config/environment.rbファイルでこれを実行します。これを行う必要があるのは1回だけです。

# Initialize the rails application
MyApp::Application.initialize!

# Set the default host and port to be the same as Action Mailer.
MyApp::Application.default_url_options = MyApp::Application.config.action_mailer.default_url_options

アプリを起動すると、アプリケーション全体が次のものdefault_url_optionsと一致しますaction_mailer.default_url_options

$ MyApp::Application.config.action_mailer.default_url_options
#=> {:host=>"lvh.me", :port=>"3000"}

$ MyApp::Application.default_url_options
#=> {:host=>"lvh.me", :port=>"3000"}

この道を私を導いてくれた@pduerstelerへのヒント


2
config/environment.rbあなたが説明したように設定することは、私のメーラーをコンソールで動作させるための鍵でした。ありがとうございました!
エリックD.フィールズ

@ EricD.Fieldsエリック、どういたしまして!これはとても便利なので、Railsコアに組み込む必要があると思います。
ジョシュア・ピンター

これはRails.application.default_url_options = Rails.application.config.action_mailer.default_url_optionsRails 5.2以降の場合です
Sandro L

ありがとう、@ SandroL!まだRails 4.2を使用しているため、それ以降のバージョンではまだテストしていません。
Joshua Pinter

数人がこれをお勧めします。私はそれは、人々はすでに歴史的な理由のために設定action_mailer.default_url_optionsを持っている傾向があるだけのことだと思うが、それはセットに複数の論理ではないことを application.default_url_optionsではなく、他の方法で回避に基づいて?ウェブサイトのリンクの仕組みを設定するときに、なぜ偽のメーラーリファレンスが必要なのですか?
ハリーウッド

24

任意のlisting_urlメソッドを使用すると、完全なURLが返されます(通常の相対URLではありません)。これが、URL全体を計算するために、railsがホストを要求する理由です。

どのようにしてホストにレールを伝えることができますか?あなたはそれをいくつかの方法で行うことができます:

1.このオプションを各環境に追加します。

[/config/development.rb]
config.action_mailer.default_url_options = { host: "localhost:3000" }
[/config/test.rb]
config.action_mailer.default_url_options = { host: "localhost:3000" }
[/config/production.rb]
config.action_mailer.default_url_options = { host: "www.example.com" }

注:Railsエンジン内で作業している場合は、エンジンテスト内のダミーアプリに対しても同じことを忘れないでください。エンジンpath_to_your_engine/test/dummy/config/environments/*をテストするとき、それがRailsのテスト対象であるためです。

2.次のようにfoo_urlメソッドにホストオプションを追加します。

listing_url(listing, host: request.host) # => 'http://localhost:3000/listings/1'

3.オプションでホストを出力しません:only_path to true

listing_url(listing, only_path: true ) # => '/listings/1'   

私見これはポイントを理解していません。この場合、私はlisting_pathメソッドを使用するためです。


ステップ1は常に私にとって有効であり、今日は製油所-cms gemを使用して、ステップ2で節約できます。コメントをありがとう。
lucianosousa

15

面白いことに、その設定config.action_mailer.default_url_optionsは私には役に立ちません。また、自分が属していないような場所で環境に依存しない設定をいじくり回すのは満足できませんでした。さらに、sidekiq / resqueワーカーでURLを生成するときに機能するソリューションが必要でした。

これまでの私のアプローチconfig/environments/{development, production}.rb

MyApp::Application.configure do
    # Stuff omitted...

    config.action_mailer.default_url_options = {
      # Set things here as usual
    }
end

MyApp::Application.default_url_options = MyApp::Application.config.action_mailer.default_url_options

これは私にとってレール> = 3.2.xで動作します。


1
これとこれだけがメーラーにURLを含めるのに役立ちましたが、アプリの他のlink_to関数を壊します。

1
素晴らしい考え、@ pduesteler!実際にこれをさらに一歩進めて、config/environment.rbファイルに1行だけ追加してこれを行うことができました。そして、詳細に入る回答を追加しました:stackoverflow.com/a/48529627/293280この方向を教えてくれてありがとう。
Joshua Pinter

9

Rails.application.routes.default_url_options[:host]= 'localhost:3000'

developeremnt.rb / test.rbでは、次のように簡潔にすることができます。

Rails.application.configure do
  # ... other config ...

  routes.default_url_options[:host] = 'localhost:3000'
end

7

いつでもhostをパラメーターとしてURLヘルパーに渡すことができます。

listing_url(listing, host: request.host)

注:ポートを追加することもできますlisting_url(listing, host: request.host, port: 3000)
drhenner

しかし、リクエストコンテキストがない場合はどうなりますか?コントローラ以外のほとんどのもので好きですか?
コートシマ

3

アプリケーションコントローラでデフォルトのURLオプションを設定できます。

class ApplicationController < ActionController::Base
  def default_url_options
    {:locale => I18n.locale}
  end
end

http://guides.rubyonrails.org/action_controller_overview.html#default_url_options


これは、必要に応じてコントローラーに固有のオプションを設定できるため、Rails 4の優れたソリューションです。
イブラヒム

1

これと同じエラーが発生しました。チュートリアルのリスト10.13を含め、すべてを正しく記述しました。

Rails.application.configure do
.
.
.
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delevery_method :test
host = 'example.com'
config.action_mailer.default_url_options = { host: host }
.
.
.
end

明らかに「example.com」が私のサーバーのURLに置き換えられています。

チュートリアルで詳しく説明したのは次の行です。

開発サーバー起動して構成をアクティブ化した後...

したがって、私にとっての答えは、サーバーをオフにしてから再びオンにすることでした。


1

config / environments / test.rbに移動します

Rails.application.routes.default_url_options [:host] = 'localhost:3000'


2
回答にはさらに情報が必要です。それが実際にソリューションとして提案しているものを説明してください。
Levi Roberts

1
回答方法に関する役立つヒントをいくつか紹介します。参考にすると便利です。
Garrett Motzner

1

ActiveStorageに関するエラーの検索で誰かがこれを見つけた場合に備えて:

ローカルのディスクサービスを使用してアップロードURLなどを生成するコントローラーアクションがある場合(テスト環境である可能性が高い)、正しく動作include ActiveStorage::SetCurrentするようblob.service_url_for_direct_uploadにするには、コントローラーで行う必要があります。


ありがとうございました!これをコントローラー(GraphQL直接アップロードミューテーション)の外で使用すると、少し微調整する必要がありましたが、機能します。私はこれを探していました、再び@phoetに感謝します:)
スタン

0

ルートにdefault_urlを追加することは適切なソリューションではありませんが、場合によっては機能します。

各環境(開発、テスト、本番)でdefault_urlを設定する必要があります。

これらの変更を行う必要があります。

    config/environments/development.rb
     config.action_mailer.default_url_options = 
      { :host => 'your-host-name' }  #if it is local then 'localhost:3000'

 config/environments/test.rb
      config.action_mailer.default_url_options = 
      { :host => 'your-host-name' }  #if it is local then 'localhost:3000'

  config/environments/development.rb
     config.action_mailer.default_url_options = 
      { :host => 'your-host-name' }  #if it is local then 'localhost:3000'

0

私はenvironment.rbを次のように設定することで問題を解決しました

YourApp :: Application.default_url_options = YourApp :: Application.config.action_mailer.default_url_options

開発、テスト、ステージング、本番などの各環境に対してアクションメーラーのdefault_url_optionsを設定する必要があります。

参照:リンクするホストがありません!:hostパラメータを指定するか、default_url_options [:host]を設定してください


0

上記の答えは私にはうまくいきませんでした。devise config.action_mailer.default_url_options = { host: "localhost", port: 3000 } をインストールして気づきまし た。それが同じ問題を持つ誰かを助けることを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.