2011-12-15 45 views
19

Trong Ruby on Rails của tôi 3.1 ứng dụng Tôi có một liên kết như thế này:Làm thế nào để thiết lập root_url

<%= link_to 'Home', root_url %> 

On dev của tôi. máy nó ám một liên kết với "localhost: 3000". Trong quá trình sản xuất, nó hiển thị liên kết với một Địa chỉ IP như thế này "83.112.12.27:8080". Tôi muốn buộc các đường ray hiển thị địa chỉ miền thay vì Địa chỉ IP. Làm thế nào tôi có thể thiết lập root_url?

Trả lời

12

Trong tuyến đường của bạn thiết lập:

root :to => 'welcome#index' 

và trong các liên kết của bạn thiết lập:

<%=link_to "Home", root_path %> 

Nó sẽ làm cho

<a href="/">Home</a> 

Vì vậy, trong localhost của bạn Nó sẽ đưa bạn đến

http://localhost:3000/

và trong máy chủ sản xuất của bạn Nó sẽ đưa bạn đến

http://yourdomian.com/

routes.rb sẽ làm cho hành động index của bộ điều khiển welcome theo mặc định.

PS. bạn cũng cần phải xóa index.html khỏi thư mục public để sử dụng.


CẬP NHẬT

hơn một chút về định tuyến:

Rails Routing from the Outside In

+0

Và nó sẽ luôn luôn đưa bạn đến '/' không có vấn đề nếu nó trên máy chủ của bạn hoặc trên localhost của bạn. –

+0

Hm. Điều đó hiệu quả. CÁM ƠN. Điều đó thật thú vị. root_url hiển thị trên máy chủ địa chỉ ip. Nhưng root_path hiển thị địa chỉ miền. –

+1

Các tuyến có tiền tố '_path' là tương đối, chúng không quan tâm đến địa chỉ ip, miền hoặc cổng của bạn. –

0

Có lẽ bạn chỉ có thể làm điều gì đó như thế này trong ApplicationController của bạn:

class ApplicationController < ActionController::Base 
    helper_method :home_uri 

    def home_uri 
    Rails.env.production? ? 'http://www.yourdomain.com' : root_url 
    end 
    ... 
end 

Và sau đó thay đổi liên kết của bạn là như thế này: <%= link_to 'Home', home_uri %>

Điều này làm cho một phương pháp helper, home_uri, mà trả về url bạn mong muốn nếu ứng dụng đang được chạy trong môi trường phát triển. Tôi không nghĩ rằng bạn có thể dễ dàng ghi đè lên root_url và tôi cũng nghĩ rằng đó có thể là một ý tưởng tồi. Tôi đã có phương pháp trợ giúp kết thúc bằng uri thay vì url vì đường ray sử dụng bộ định tuyến để tự động tạo phương thức kết thúc bằng url, vì vậy nếu bạn có tuyến đường có tên home, giải pháp này sẽ không ghi đè hoặc xung đột với phương thức trợ giúp tuyến đường được đặt tên đó. You can read more about named route helper methods here if you're interested.

+3

Có.Tôi có thể làm điều đó. Nhưng đó không phải là mục đích của "root_url". Không có cách nào để xác định "root_url" cho các môi trường khác nhau? Tôi muốn xác định root_url trong development.rb và production.rb. –

35

Bạn đang tìm kiếm ActionController's default url option. Vì vậy, bạn có thể làm điều gì đó như:

class ApplicationController < ActionController::Base 
    def default_url_options 
    if Rails.env.production? 
     {:host => "www.example.com"} 
    else 
     {} 
    end 
    end 
end 

Điều này cũng hoạt động đối với ActionMailer. Đồng thời, cả hai có thể được đặt trong môi trường của bạn .rb hoặc application.rb

# default host for mailer 
config.action_mailer.default_url_options = { 
    host: 'example.com', protocol: 'https://' 
} 

# default host for controllers 
config.action_controller.default_url_options = { 
    :host => "www.example.com" 
} 
+1

có. Đó là khá nhiều những gì tôi đang tìm kiếm. CÁM ƠN. –

+5

Cảm ơn. nó làm việc cho tôi. Nhưng tôi thích làm điều đó trong 'application.rb' và thêm' config.action_controller.default_url_options = {: host => "justinbiebiersucks.com"} ' –

+1

Có application.rb là một nơi thích hợp hơn. Tôi không nhớ tại sao tôi lại đề nghị như vậy. Và yêu thích tên miền ví dụ bằng cách này;) – lucapette

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