나는 지금 약 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
🙂
답변
답변
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