2012-08-30 31 views
5

Theo mặc định, Rails có thể tìm thấy quan điểm với các định dạng, miền địa phương và ngôn ngữ mẫu trong tên tập tin (vì vậy tôi có thể tạo index.de.json.erb)biến Tuỳ chỉnh trong Rails xem filename

Có thể thêm một, thông số tùy chỉnh để quan điểm của tên tệp?

Tôi muốn vượt qua các tên miền phụ hiện tại, vì vậy sẽ làm cho http://foo.example.com/index.foo.html.erb, và http://bar.example.com/ sẽ làm cho index.bar.html.erb (cả trong số họ với index.html.erb dự phòng).

Trả lời

8

Mẫu phân giải được sử dụng để tra cứu chế độ xem chỉ có thể chứa các biến được đăng ký với lớp ActionView::LookupContext. Bước đầu tiên do đó là đăng ký một biến mới (subdomain) với lớp LookupContext. Bạn nên làm điều này trong một initializer:

ActionView::LookupContext.register_detail(:subdomain) do 
    ['default_subdomain'] 
end 

Bây giờ LookupContext biết về subdomain, nó có thể được đưa vào mô hình giải quyết. Để cụ thể hơn về việc thay đổi mô hình giải quyết, xem ActionView::FileSystemResolver documentation, nhưng về cơ bản bạn nên bao gồm những điều sau đây, cũng trong một initializer:

ActionController::Base.view_paths = ActionView::FileSystemResolver.new(
    Rails.root.join('app', 'views'), 
    ':prefix/:action{.:locale,}{.:subdomain,}{.:formats,}{.:handlers,}' 
) 

mô hình này được cuối cùng truyền cho Dir.glob (sau khi :* biến đã được thay thế). Mẫu toàn cầu {.:subdomain,} có nghĩa là .:subdomain hoặc không có gì”, cung cấp dự phòng cho tệp xem không có tên miền phụ nếu không tìm thấy tệp có tên miền phụ.

Bước cuối cùng là để cập nhật ApplicationController của bạn để vượt qua các tên miền phụ cho LookupContext:.

class ApplicationController < ActionController::Base 
    def details_for_lookup 
    {:subdomain => [request.subdomain]} 
    end 
end 

(Câu trả lời này đã được chủ yếu là tìm ra bằng cách đọc mã nguồn, một số các tính năng này không được minh chứng Đó là thử nghiệm với Rails 3.2.5)

+0

cảm ơn! đó là _exacly_ những gì tôi cần. – user1105595

+0

Vui vì tôi có thể trợ giúp và chào mừng bạn đến với Stack Overflow. Nếu câu trả lời giải quyết được vấn đề của bạn, bạn nên đánh dấu nó là được chấp nhận, thông tin thêm về cách thức và lý do tại sao: http://meta.stackexchange.com/a/5235 – georgebrock

1

Tôi không nghĩ rằng bạn cần một trình xử lý tùy chỉnh ở đây. Bạn không thực hiện việc chuẩn bị trước các mẫu của mình, nhưng bạn chỉ cần các mẫu của mình để trở thành tên miền cụ thể.

tôi sẽ xem xét đưa ra một cái gì đó như thế này:

# in ApplicationController: 
    before_filter :set_view_paths 

    def set_view_paths 
    self.class.view_paths = Rails.root.join('app', 'views', controller_name, request.subdomain) 
    end 

Sau đó, bạn cần phải đặt các mẫu của bạn cho miền foo vào foo thư mục của mỗi con đường views/controller_name.

Đồng thời kiểm tra append/prepend_view_path documentation để cho phép mặc định trong trường hợp không có chế độ xem tên miền.