OK, tôi đã quản lý để sắp xếp ra vấn đề này:
không có cách nào để làm điều này trong Rails theo mặc định (ít nhất, chưa). Thay vì sử dụng không gian tên và giá trị mặc định, tôi cần cài đặt Sven Fuchs' routing filter.
Khi plugin được cài đặt, tôi đã thêm các file sau vào thư mục lib của tôi:
require 'routing_filter/base'
module RoutingFilter
class Locale < Base
# remove the locale from the beginning of the path, pass the path
# to the given block and set it to the resulting params hash
def around_recognize(path, env, &block)
locale = nil
path.sub! %r(^/([a-zA-Z]{2})(?=/|$)) do locale = $1; '' end
returning yield do |params|
params[:locale] = locale || 'en'
end
end
def around_generate(*args, &block)
locale = args.extract_options!.delete(:locale) || 'en'
returning yield do |result|
if locale != 'en'
result.sub!(%r(^(http.?://[^/]*)?(.*))){ "#{$1}/#{locale}#{$2}" }
end
end
end
end
end
tôi đã thêm dòng này để routes.rb:
map.filter 'locale'
này về cơ bản điền vào một trước và sau khi móc, được tạo ra bởi các plugin, mà kết thúc tốt đẹp định tuyến đường ray.
Khi url được nhận dạng và trước khi Rails được thực hiện bất kỳ điều gì với nó, phương thức around_recognize được gọi. Điều này sẽ trích xuất một mã hai chữ cái đại diện cho miền địa phương, và vượt qua nó thông qua trong các params, mặc định là 'en' nếu không có miền địa phương được chỉ định.
Tương tự, khi url được tạo, tham số miền địa phương sẽ được đẩy vào URL ở bên trái.
này mang lại cho tôi các url và ánh xạ sau:
/ => :locale => 'en'
/en => :locale => 'en'
/fr => :locale => 'fr'
Tất cả những người giúp đỡ url hiện hoạt động như trước, với sự khác biệt duy nhất là trừ khi locale được chỉ định, nó được bảo tồn:
home_path =>/
home_path(:locale => 'en') =>/
home_path(:locale => 'fr') => /fr
Trong ví dụ của bạn, bạn chỉ tham khảo 1 bộ điều khiển, nhưng tôi mang nó bạn muốn tạo tuyến đường này cho mỗi bộ điều khiển? –