2012-03-11 27 views
7

Tôi có khoảng 5 kiểu máy hoạt động rất giống nhau. Trong thực tế, tôi muốn họ chia sẻ một hành động để hiển thị chúng. Ví dụ, đối với mô hình xe hơi, xe tải, Văn Tôi muốn có một định nghĩa như:Sử dụng một hành động cho nhiều kiểu máy

[Car, Truck, Van].each do |Model| 
    action_for Model do #I made this up to show what I mean 
    def index 
     @model = Model.all 
     @model_names = @model.map(&:name).join(', ') 
    end 
    end 
end 

Làm thế nào tôi sẽ làm điều này vì vậy tôi không xác định hành động tương tự trong nhiều bộ điều khiển? (Mà không phải là rất DRY) Nó sẽ được trong application_controller? Và nếu nó không quá nhiều để hỏi, làm thế nào tôi có thể làm điều này để họ cũng chia sẻ quan điểm?

CẬP NHẬT

Nó sẽ được ưa thích nếu điều này có thể được bên ngoài điều khiển cá nhân. Nếu tôi có thể làm điều này để làm việc đúng, tôi muốn thậm chí không phải tạo ra các bộ điều khiển riêng lẻ.

+0

Bạn có thể quan tâm đến việc nhìn trộm hoặc sử dụng [Tài nguyên kế thừa] (https://github.com/josevalim/inherited_resources) của José Valim. ActiveAdmin sử dụng nó cho các hành động RESTful mặc định. – coreyward

Trả lời

3

Điều gì đó có thể phù hợp với bạn?

module Display 
    def index 
    m = self.class.to_s.chomp('Controller').classify.constantize 
    @model = m.all 
    @model_names = @model.map(&:name).join(', ') 
    end 
end 

Trong điều khiển:

class CarsController < ApplicationController 
    include Display 
end 

class TrucksController < ApplicationController 
    include Display 
end 

class VansController < ApplicationController 
    include Display 
end 

Edit: một nỗ lực để làm điều này mà không cần điều khiển cá nhân

class DisplaysController < ApplicationController 
    def index 
    @model = params[:model].constantize.all 
    @model_names = @model.map(&:name).join(', ') 
    end 
end 

routes.rb

match "display" => "display#index", :as => :display 

Trong một cái nhìn

link_to "Display Cars", display_path(:model => "Car") 
link_to "Display Trucks", display_path(:model => "Truck") 
link_to "Display Vans", display_path(:model => "Van") 

Lưu ý: Nếu bạn đã nghe nói về extend cho mô-đun và đang tự hỏi tại sao/khi nào sử dụng include vs extend, xem What is the difference between include and extend in Ruby? (về cơ bản bao gồm là dành cho trường hợp, mở rộng cho các phương pháp lớp).

+0

Rất tốt! Tôi sẽ giữ cho một chút mặc dù nếu bạn không nhớ. Nếu tôi có thể tìm thấy câu trả lời tôi đang nghĩ đến, tôi thậm chí không cần bộ điều khiển cho mỗi mô hình –

+0

@KyleMacey - Tôi nghĩ rằng bản chỉnh sửa của tôi sẽ hoạt động cho bạn nhưng tôi chưa thử nghiệm. Hãy cho tôi biết nếu bạn thử nó và nó không hoạt động để tôi có thể loại bỏ nó. – Kyle

+0

Thay vì sử dụng 'Object.const_get', bạn có thể sử dụng' constantize'. Bạn có thể rút ngắn toàn bộ dòng đó thành 'm = name.chomp ('Controller'). Classify.constantize'. – coreyward

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