연결할 호스트가 없습니다! : 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)>'

이 코드는 이메일 / ActionMailer와 아무 관련이 없으며 경로 대신 URL이 필요합니다.

어떤 아이디어?


어쨌든 호스트는 무엇입니까?
Jwan622

답변:


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

3
나는 이것과 매우 유사하며 action_mailer에 대한 default_url_option을 설정하면 도움이되지 않습니다. 사용 사례는 다음과 비슷합니다. Rails.application.routes.url_helpers.message_image_url (2)
Boti

1
이것을 했습니까? 프로덕션 환경에서 호스트 이름 앞에 www가 있거나 없어도 여전히 같은 오류가 발생합니다. @ d11wtq 당 경로를 추가하고 작동했습니다. 이 동작을 일으킨 Rails4 변경이 있습니까? 나는 업그레이드하기 전에 그것을 보지 못했고, 특정 메일 전송 (devise-automated)에서만 보았습니다.
JosephK

이것이 Rails 4 프로젝트에서 작동하지 않는 것을 확인할 수 있습니다. 경로로 설정하는 것은 옵션이 아닙니다.
b1nary

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 helper 호출에서 대신 각 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

10
경로 파일 내에서 다음을 수행하는 것이 더 나은 방법입니다 default_url_options Rails.application.config.action_mailer.default_url_options.
siannopollo

42

호스트는 각 환경의 구성 파일에서 지정해야합니다. 예 :

config/environments/development.rb

참조 이 질문이 질문을 .


4
덕분에, 이럴이 사용이 routes.draw하는 대답보다 더 나은 답변입니다
joelparkerhenderson

1
이 답변은 다른 도메인을 사용할 때 도움이되지 않으며 다른 문제를 해결합니다.
Ryan

1
@Ryan 그냥 환경 변수를 사용하여 해결할 수 있습니다
courtsimas

35

default_url_options을 사용하도록 설정 하십시오 action_mailer.default_url_options.

환경 파일 (예를 들어 각에서 development.rb, production.rb등) 당신은을 지정할 수 있습니다 default_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.rb, production.rb등).

가능한 한 건조한 것들을 유지하려면 config/environment.rb파일 에서이 작업을 수행하면 한 번만 수행하면됩니다.

# 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설명한대로 설정하는 것이 메일러가 콘솔에서 작동하게하는 열쇠입니다. 감사합니다!
Eric D. Fields

@ EricD.Fields 천만에요, Eric! 나는 이것이 Rails 코어에 내장되어야한다고 생각할 정도로 유용하다는 것을 알았습니다.
Joshua Pinter

즉 것 Rails.application.default_url_options = Rails.application.config.action_mailer.default_url_options5.2 이상 레일
산드로 L

감사합니다, @SandroL! 우리는 여전히 Rails 4.2를 사용하고 있으므로 이후 버전에서는 아직 테스트하지 않았습니다.
Joshua Pinter

이것을 추천하는 몇 사람. 사람들이 역사적 이유로 이미 action_mailer.default_url_options를 구성하는 경향이 있지만 , 다른 방법보다는 application.default_url_options 기반으로 설정 하는 것이 더 논리적이지 않습니까? 웹 사이트 링크 작동 방식을 구성 할 때 가짜 메일러 참조가 필요한 이유는 무엇입니까?
해리 우드

24

어떤 listing_url방법 을 사용 하면 전체 URL이 반환됩니다 (상대적으로는 아닙니다). 레일즈가 전체 URL을 계산하기 위해 호스트를 요구하는 이유입니다.

어떻게 호스트에게 레일을 말할 수 있습니까? 여러 가지 방법으로 수행 할 수 있습니다.

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" }

참고 : 레일 엔진 내부에서 작업하는 경우 엔진 테스트 내부의 더미 앱에 대해서도 동일한 작업을 수행해야합니다. 엔진을 테스트 path_to_your_engine/test/dummy/config/environments/*할 때는 레일이 테스트하는 것이기 때문입니다.

다음과 같이 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'   

IMHO 나는이 경우에 listing_path방법을 사용할 것이기 때문에 이것에 대한 요점이 보이지 않습니다.


1 단계는 항상 저와 오늘 작동합니다 .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파일에 한 줄만 추가 하면됩니다. 그리고 자세한 답변을 추가했습니다 : stackoverflow.com/a/48529627/293280 이 방향으로 나를 가리켜 주셔서 감사합니다.
Joshua Pinter

9

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

developemnt.rb / test.rb에서 다음과 같이 더 간결 할 수 있습니다.

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

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

7

URL 도우미에 항상 호스트를 매개 변수로 전달할 수 있습니다.

listing_url(listing, host: request.host)

참고 : 포트를 추가 할 수도 있습니다listing_url(listing, host: request.host, port: 3000)
drhenner

그러나 요청 컨텍스트가 없으면 어떻게해야합니까? 컨트롤러 이외의 다른 것들처럼?
courtsimas


1

나는이 같은 오류가 있었다. 튜토리얼의 Listing 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
다음은 답변 방법 에 대한 유용한 팁입니다 . 나는 그들이 참조하는 것이 유용하다는 것을 알았습니다.
개럿 Motzner

1

누군가 ActiveStorage와 관련된 오류를 검색하는 경우를 대비하여 :

로컬 디스크 서비스 (대부분 테스트 환경에서)로 업로드 URL 등을 생성하려는 include ActiveStorage::SetCurrent컨트롤러 blob.service_url_for_direct_upload작업이있는 경우 올바르게 작동 하려면 컨트롤러에 있어야 합니다.


감사합니다! 이것을 컨트롤러 외부 (GraphQL 직접 업로드 돌연변이) 외부에서 사용하면 약간 조정해야했지만 작동합니다. 나는 이것을 찾고 있었다, 다시 한번 감사합니다 @phoet :)
Stan

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

위의 답변은 적어도 내가 원 한대로 작동하지 않았습니다. config.action_mailer.default_url_options = { host: "localhost", port: 3000 } 고안을 설치 한 후에 깨달았습니다 . 그것이 같은 문제를 가진 사람을 도울 수 있기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.