[ruby-on-rails] 연결할 호스트가 없습니다! : host 매개 변수를 제공하거나 default_url_options [: host]를 설정하십시오

나는 지금 약 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이 필요합니다.

어떤 아이디어?



답변

모든 환경에서 다음 줄을 추가해야합니다.

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


답변

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

  # ... snip ...
end

어딘가에 routes.rb🙂


답변

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

config/environments/development.rb

참조 이 질문이 질문을 .


답변

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의 모자 팁 .


답변

어떤 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방법을 사용할 것이기 때문에 이것에 대한 요점이 보이지 않습니다.


답변

재미있는 것은, 그 설정 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에서 작동합니다.


답변

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