2012-02-15 32 views
14

Tôi cần sử dụng phương thức root_url từ phương thức được xác định trong tệp trong thư mục lib. Điều đó có thể không?Cách sử dụng phương thức trợ giúp tuyến đường từ một tệp trong thư mục lib?

tôi đã cố gắng bao gồm dòng này trong lớp học của tôi:

include Rails.application.routes.url_helpers 

nhưng điều này mang lại cho tôi những lỗi

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


Edit: tôi phát hiện ra rằng nó hoạt động nếu tôi lần đầu tiên khởi tạo các tuyến đường:

def initialize_routes 
    if Rails.env.development? || Rails.env.test? 
    Rails.application.routes.default_url_options[:host] = 'localhost:3000' 
    elsif Rails.env.production? 
    Rails.application.routes.default_url_options[:host] = 'example.com' 
    end 
end 

Có cách nào tốt hơn để hoàn thành việc này? Có thể thiết lập các tuyến đường trong một tập tin cấu hình?

+0

Câu trả lời này thực sự đã giúp tôi: http://stackoverflow.com/a/16728549/2639304 –

Trả lời

11

Nên có một vài giải pháp cho việc này.

1) khi sử dụng root_url vượt qua trong param máy chủ như:

root_url(:host => 'localhost') 

Đó sẽ cần phải được thực hiện cho được môi trường cụ thể mặc dù.

2) Bạn cũng sẽ có thể thiết lập các tuyến đường default_url_options như:

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

3) Trong file cấu hình môi trường của bạn, bạn nên thiết lập các default_url_options như đã nêu trong báo lỗi. Ví dụ:

Trong config/environments/development.rb:

config.action_mailer.default_url_options[:host] = 'localhost' 

Trong config/environments/test.rb:

config.action_mailer.default_url_options[:host] = 'localhost' 

Trong config/environments/production.rb:

config.action_mailer.default_url_options[:host] = 'production.com' 
+0

# 1 và # 2 hoạt động tốt. Mặc dù # 3 thì không. # 2 nghe như giải pháp tốt nhất. Tôi sẽ để lại câu trả lời mở để xem ai đó biết làm thế nào để thiết lập này từ các tập tin cấu hình. Cảm ơn bạn đã giúp đỡ! – alf

28

@ giải pháp # 3 JDutil của, như đã đề cập trong các ý kiến, là cấu hình mailer hành động chứ không phải các tuyến của router. Tuy nhiên, trong cấu hình bạn có thể thực hiện như sau:

Trong config/environments/development.rbconfig/environments/test.rb:

MyApp::Application.configure do 
    # other configuration ... 
    config.after_initialize do 
    Rails.application.routes.default_url_options[:host] = 'localhost:3000' 
    end 
end 
+0

Điều này thực sự hiệu quả. Cảm ơn! – alf

+0

Cảm ơn bạn! Nó cũng làm việc cho tôi. –

+3

'Rails.application.routes.default_url_options = Rails.application.config.action_mailer.default_url_options' thậm chí có thể là –

6

Nếu bạn đang dựa vào url_helpers cho một cái gì đó giống như ActiveModel::Serializers (. Ít nhất là v0.9 * series) nơi bạn sẽ tạo URL bên ngoài luồng yêu cầu/phản hồi Rails chính, bạn cũng sẽ cần đặt Rails.application.routes.default_url_options. Tôi đã thực hiện nó như vậy,

# config/application.rb 

config.after_initialize do 
    Rails.application.routes.default_url_options = config.action_mailer.default_url_options 
end 

Trình trợ giúp url hiện có sẵn, với máy chủ mặc định, ở những nơi như công việc nền, v.v ...

+0

Chỉ đến' default_url_options' hiện có là rất tốt trong trường hợp này. Nó giải quyết vấn đề cho tất cả các môi trường của tôi. – counterbeing

0

Tôi đã gặp sự cố tương tự chính xác này và không có đề xuất cấu hình nào hoạt động. Điều đó khiến tôi bối rối là url_helpers hoạt động tốt từ các phần khác của ứng dụng (cụ thể là người trợ giúp). Vì vậy, tôi không cần phải chèn cấu hình mới để có thể sử dụng chúng ở nơi khác.

Giải pháp của tôi vào cuối ngày là để làm điều này:

Rails.application.routes.url_helpers.athlete_url(athlete) 

gì tôi nghi ngờ, mặc dù tôi không thể chứng minh, đó là bao gồm cả những người giúp đỡ url bằng tay với:

include Rails.application.routes.url_helpers 

thực sự làm cho một số khối included được thực hiện. Làm như vậy sẽ thay đổi cấu hình từ bên dưới mã đang cố gắng sử dụng nó. Bằng cách không bao gồm, nhưng thay vì đề cập đến nó trực tiếp bất kỳ khối 'bao gồm' không được thực hiện lại.

Tôi rất muốn biết liệu có ai có thể giải thích nếu tôi đi đúng hướng hay chỉ đưa ra các giả định sai.

Tóm lại, hãy tham khảo url_helpers với toàn bộ đường dẫn mô-đun/lớp đã hoàn thành công việc.

Các vấn đề liên quan