Thiếu máy chủ để liên kết đến! Vui lòng cung cấp: tham số máy chủ hoặc đặt default_url_options [: host]


183

Tôi đã googling khoảng 90 phút và vẫn chưa có câu trả lời cho điều này. Tôi đặt ở default_url_optionsđâu? Tôi đã thiết lập nó config.action_mailer.default_url_optionsđể giải quyết lỗi tương tự này ở nơi khác, nhưng bây giờ tôi đang gặp lỗi này khi cố gắng sử dụng trình trợ giúp URL bên trong thông số RSpec. Tôi không biết nó đang đặt default_url_options ở đâu.

 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)>'

Mã này không liên quan gì đến email / ActionMailer, nó chỉ cần một URL thay vì một đường dẫn.

Có ý kiến ​​gì không?


Máy chủ là gì?
Jwan622

Câu trả lời:


260

Bạn cần thêm dòng sau vào mọi môi trường:

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

Bằng cách đó, nó có thể hoạt động trong mọi môi trường và có thể khác biệt với môi trường. Ví dụ:

phát triển.rb

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

kiểm tra.rb

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

sản xuất.rb

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

16
Cũng đảm bảo rằng bạn khởi động lại máy chủ rails sau khi bạn thêm nó. Các tập tin theo cấu hình / không được tự động tải lại.
Stenerson

3
Tôi đã làm rất giống với điều này và đặt default_url_option cho action_mailer sẽ không giúp ích. Trường hợp sử dụng tương tự như sau: Rails.application.routes.url_helpers.message_image_url (2)
Boti

1
Đã làm điều này; có hoặc không có www ... tiền tố tên máy chủ trong sản xuất, tôi vẫn gặp lỗi tương tự. Đã thêm tuyến đường mỗi @ d11wtq và nó đã hoạt động. Có một số thay đổi Rails4 gây ra hành vi này? Tôi chưa bao giờ nhìn thấy nó trước khi nâng cấp, và chỉ trong một lần gửi thư cụ thể (tự động phát triển), kể từ đó.
JosephK

Có thể xác nhận rằng điều này không hoạt động trong các dự án Rails 4 của tôi. Đặt nó trong các tuyến đường chỉ đơn giản là không có tùy chọn.
b1nary

4
Không hoạt động trong Rails 5. default_url_options Rails.application.config.action_mailer.default_url_optionsMặc dù đã thêm và điều đó đã tạo nên mánh khóe, như được đề xuất bởi một người bình luận khác
BooBailey

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

  # ... snip ...
end

Ở đâu đó trong routes.rb:)


35
Không tốt lắm nếu bạn có nhiều môi trường khác nhau với các URL khác nhau
Neil Middleton

2
Vâng, bạn sẽ làm gì nếu bạn có nhiều tên miền env?
wejrowski

Có lẽ bạn chỉ cần chỉ định nó cho từng URL thay vào đó, trong bản đồ tuyến đường hoặc trong lệnh gọi trình trợ giúp url : listing_url(listing, :host => "whatever.com").
d11wtq

14
Trong tệp cấu hình cho từng môi trường tương ứng, tôi thêm tùy chọn tùy chỉnh này: config.domain = 'staging.myapp.com'(tất nhiên thay thế trong một tên miền chính xác cho mỗi env). Sau đó, routes.rbtôi được sử dụng miễn phí default_url_options host: Rails.application.config.domainvà nó sẽ hoạt động trong mọi môi trường. Không có gì.
Prathan Thananart

10
Một cách tiếp cận tốt hơn sẽ là, trong tệp tuyến đường, làm điều này : default_url_options Rails.application.config.action_mailer.default_url_options.
siannopollo

42

Máy chủ phải được chỉ định trong tệp cấu hình của từng môi trường. Ví dụ:

config/environments/development.rb

Xem câu hỏi nàycâu hỏi này .


4
Cảm ơn, IMHO đây là một câu trả lời tốt hơn câu trả lời sử dụng Rout.draw
joelparkerhenderson

1
Câu trả lời này không giúp ích khi sử dụng các tên miền khác nhau và giải quyết các vấn đề khác.
Ryan

1
@Ryan bạn chỉ có thể sử dụng các vars môi trường để khắc phục điều đó
Courtimas

35

Đặt default_url_optionsđể sử dụng của bạn action_mailer.default_url_options.

Trong mỗi file môi trường của bạn (ví dụ development.rb, production.rbvv), bạn có thể chỉ định default_url_optionsđể sử dụng cho action_mailer:

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

Tuy nhiên, những điều này không được đặt cho MyApp:Application.default_url_options:

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

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

Đó là lý do tại sao bạn nhận được lỗi đó ở bất cứ thứ gì bên ngoài ActionMailer .

Bạn có thể cài ứng dụng của bạn là default_url_optionssử dụng những gì bạn định nghĩa cho action_mailertrong file môi trường thích hợp ( development.rb, production.rb, vv).

Để giữ mọi thứ càng tốt càng tốt, hãy làm điều này trong config/environment.rbtệp của bạn để bạn chỉ phải làm điều này một lần:

# 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

Bây giờ khi bạn khởi động ứng dụng của mình, toàn bộ Ứng dụng của default_url_optionsbạn sẽ khớp với 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"}

Hat tip cho @pduersteler để dẫn tôi xuống con đường này.


2
Thiết lập config/environment.rbnhư bạn mô tả là chìa khóa để đưa thư của tôi hoạt động trong bảng điều khiển. Cảm ơn bạn!
Eric D. Lĩnh vực

@ EricD.Fields Bạn rất hoan nghênh, Eric! Tôi thấy điều này hữu ích đến mức tôi nghĩ rằng nó nên được tích hợp vào lõi Rails.
Joshua Pinter

Đó sẽ là Rails.application.default_url_options = Rails.application.config.action_mailer.default_url_optionscho Rails 5.2+
Sandro L

Cảm ơn, @SandroL! Chúng tôi vẫn đang sử dụng Rails 4.2 vì vậy chưa được thử nghiệm trên các phiên bản mới hơn.
Joshua Pinter

Một vài người đề nghị này. Tôi đoán nó chỉ là người có xu hướng có action_mailer.default_url_options đã được cấu hình vì những lý do lịch sử, nhưng không phải là nó hợp lý hơn để thiết lập dựa trên application.default_url_options chứ không phải là cách khác xung quanh? Tại sao liên quan đến một tài liệu tham khảo gửi thư không có thật khi cấu hình cách liên kết trang web của bạn hoạt động?
Harry Wood

24

Khi bạn sử dụng bất kỳ listing_urlphương thức nào , URL đầy đủ sẽ được trả về (không phải là một phương thức tương đối như bình thường). Đó là lý do tại sao đường ray yêu cầu bạn cho máy chủ lưu trữ, để tính toán toàn bộ URL.

Làm thế nào bạn có thể nói với đường ray máy chủ? Bạn có thể làm điều đó theo nhiều cách:

1.Adding tùy chọn này cho từng môi trường:

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

LƯU Ý: Nếu bạn đang làm việc bên trong động cơ ray, hãy nhớ thực hiện tương tự cho ứng dụng giả của bạn bên trong các thử nghiệm động cơ: path_to_your_engine/test/dummy/config/environments/*bởi vì khi bạn kiểm tra động cơ, đó là đường ray nào đang thử nghiệm.

2.Thêm tùy chọn máy chủ vào phương thức foo_url như thế này:

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

3.Không xuất ra máy chủ với tùy chọn:only_path to true .

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

IMHO Tôi không thấy điểm này, vì trong trường hợp này tôi sẽ sử dụng listing_pathphương pháp này


Bước 1 luôn làm việc cho tôi và hôm nay, sử dụng đá quý tinh chế-cms chỉ cần bước 2 cứu tôi. Cảm ơn các bình luận.
lucianosousa

15

Điều buồn cười, thiết lập đó config.action_mailer.default_url_options đó không giúp ích gì cho tôi. Ngoài ra, loay hoay với các thiết lập độc lập với môi trường ở những nơi tôi cảm thấy như nó không thuộc về tôi không làm tôi hài lòng. Ngoài ra, tôi muốn một giải pháp hoạt động khi tạo các url trong công nhân sidekiq / resque.

Cách tiếp cận của tôi cho đến nay, mà đi vào 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

Điều này làm việc cho tôi trong rails> = 3.2.x.


1
Điều này và chỉ điều này hoạt động để khiến người gửi thư bao gồm URL, nhưng nó phá vỡ các chức năng link_to khác trong ứng dụng của tôi.

1
Suy nghĩ tuyệt vời, @pduesteler! Tôi thực sự đã tiến thêm một bước này và có thể thêm chỉ một dòng trong config/environment.rbtệp để làm điều này. Và thêm câu trả lời đi vào chi tiết: stackoverflow.com/a/48529627/293280 Cảm ơn bạn đã chỉ cho tôi theo hướng này.
Joshua Pinter

9

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

Trong Developemnt.rb / test.rb, có thể ngắn gọn hơn như sau:

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

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

7

Bạn luôn có thể chuyển máy chủ dưới dạng tham số cho trình trợ giúp URL:

listing_url(listing, host: request.host)

Lưu ý: Bạn cũng có thể thêm một cổnglisting_url(listing, host: request.host, port: 3000)
drhenner

Nhưng nếu bạn không có bối cảnh yêu cầu thì sao? Giống như trong hầu hết mọi thứ khác ngoài một bộ điều khiển?
Courtimas


1

Tôi đã có lỗi tương tự. Tôi đã có mọi thứ được viết chính xác, bao gồm cả Liệt kê 10.13 từ hướng dẫn.

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

rõ ràng với "example.com" được thay thế bằng url máy chủ của tôi.

Những gì tôi đã trình bày trong hướng dẫn là dòng này:

Sau khi khởi động lại máy chủ phát triển để kích hoạt cấu hình ...

Vì vậy, câu trả lời cho tôi là tắt máy chủ và bật lại.


1

đi tới cấu hình / môi trường / test.rb

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


2
Trả lời cần thêm thông tin. Vui lòng mô tả những gì bạn thực sự đề xuất là giải pháp.
Levi Roberts

1
Dưới đây là một số lời khuyên hữu ích về cách trả lời . Tôi thấy chúng hữu ích để tham khảo.
Garrett Motzner

1

chỉ trong trường hợp ai đó tìm thấy lỗi này khi tìm kiếm lỗi liên quan đến ActiveStorage:

nếu bạn có hành động điều khiển trong đó bạn muốn tạo url tải lên, v.v. với dịch vụ đĩa cục bộ (rất có thể trong môi trường kiểm tra), bạn cần phải include ActiveStorage::SetCurrenttrong trình điều khiển để cho phép blob.service_url_for_direct_uploadhoạt động chính xác.


Cảm ơn bạn! Sử dụng điều này bên ngoài bộ điều khiển (đột biến tải lên trực tiếp GraphQL) vì vậy phải điều chỉnh nó một chút, nhưng hoạt động. Tôi đã tìm kiếm cái này, cảm ơn lần nữa @phoet :)
Stan

0

Thêm default_url trong các tuyến không phải là giải pháp phù hợp, mặc dù vậy, nó hoạt động trong một số trường hợp.

Bạn đã đặt default_url trong từng môi trường (phát triển, thử nghiệm, sản xuất).

Bạn cần thực hiện những thay đổi này.

    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

Tôi đã giải quyết vấn đề bằng cách cấu hình môi trường.rb là

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

Bạn cần đặt default_url_options cho trình gửi thư hành động đối với từng môi trường như phát triển, thử nghiệm, dàn dựng và sản xuất, v.v.

Tham khảo: Thiếu máy chủ để liên kết đến! Vui lòng cung cấp: tham số máy chủ hoặc đặt default_url_options [: host]


0

Câu trả lời trên không có tác dụng với tôi, ít nhất là không như tôi muốn. Tôi nhận ra config.action_mailer.default_url_options = { host: "localhost", port: 3000 } sau khi cài đặt nghĩ ra. Hy vọng nó sẽ giúp được ai đó với cùng một vấn đề.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.