2011-01-31 39 views
5

Tôi có một loạt các bộ điều khiển với các phương thức hiển thị chế độ xem chỉ mục. Điều này dẫn đến việc tôi viết render :index vào cuối phần lớn các phương pháp. Dưới đây là ví dụLàm cách nào tôi có thể DÙNG tất cả các cuộc gọi này để hiển thị: chỉ mục?

def index 
    @models = Model.find(:all) 
end 

def new_models 
    @models = Model.find_by_new(true) 

    render :index 
end 

def old_models 
    @models = Model.find_by_new(false) 

    render :index 
end 

Lý tưởng nhất, tôi sẽ chỉ chuyển mã kết xuất vào bộ lọc sau, trước khi chuyển sang bộ lọc sau không phải là tùy chọn.

Tôi có một số lượng lớn bộ điều khiển như thế này nên giải pháp sẽ loại bỏ nhiều mã lặp lại.

Ứng dụng này hiện vẫn là Rails 2.3, tuy nhiên, ứng dụng này sẽ được nâng cấp lên Rails 3 trong tháng tới hoặc hai. Vì vậy, trong khi tôi muốn một kỹ thuật hoạt động trên 2,3, Rails 3 chỉ có các giải pháp vẫn sẽ được đánh giá cao.

+3

chỉ cần một lưu ý, cố gắng tránh connascence ý nghĩa càng nhiều càng tốt. (tôi chỉ * đã * để sử dụng 'từ' đó ngày, bởi vì tôi vừa học về sự kết nối **: D **) Xem http://scotland-on-rails.s3.amazonaws.com/1A03_JimWeirich-SOR.mp4 nếu quan tâm – Zabba

+0

Đó là một cuộc nói chuyện rất hay. Cảm ơn bạn đã chia sẻ nó. Ví dụ của tôi không phải là bất kỳ mã nào tôi đã thực sự viết. Tôi đã chỉ đưa ra mã ngẫu nhiên mà không có nhiều mặc dù cho ví dụ. Tôi rất vui vì tôi đã làm điều đó như vậy, nếu không tôi có thể chưa bao giờ học về sự kết nối :-) –

Trả lời

4

Nếu bạn thực sự muốn DỪNG hành động này, và nếu nó rất phổ biến, thì bạn có thể làm một số chương trình meta của riêng bạn. Đầu tiên tạo một file render_with_index.rb với định nghĩa module này:

 
module RenderWithIndex 
    def self.included klass 
    klass.class_eval do 
     def self.render_with_index * methods 
     methods.each do |method| 
      self.class_eval <<-EVAL 
      alias :old_method :#{method} 

      def #{method} 
       old_method 
       render :index 
      end 
      EVAL 
     end 
     end 
    end 
    end 
end 

Sau đó, bao gồm rằng mô-đun trong điều khiển của bạn và xác định các phương pháp mà nên làm với index (đảm bảo cuộc gọi render_with_index xảy ra sau khi khai báo phương thức của bạn

.
 
include RenderWithIndex 

def index 
    @models = Model.find(:all) 
end 

def new_models 
    @models = Model.find_by_new(true) 
end 

def old_models 
    @models = Model.find_by_new(false) 
end 

render_with_index :new_models, :old_models 

Module này bây giờ cho phép bạn để làm cho bất kỳ hành động với các mẫu chỉ số chỉ đơn giản bằng cách thêm vào cuộc gọi render_with_index.

+0

+1 cho một cách tiếp cận khác :) – hade

+0

Tuyệt vời :-) Chính xác những gì tôi đang tìm kiếm. –

2

Dường như khá DRY với tôi. IMHO nó là một habbit tốt để đề cập đến mẫu bạn đang vẽ nếu bạn không muốn sử dụng mẫu phương pháp điều khiển cụ thể.

Nếu mã kết xuất của bạn mở rộng từ một lớp lót thành nhiều dòng mã, tôi sẽ DRY chúng thành phương thức kết xuất riêng biệt.

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