2008-09-24 22 views
77

Tôi có một số phương pháp điều khiển tôi muốn chia sẻ. Thực hành tốt nhất để làm điều này trong ruby ​​trên đường ray là gì? Tôi có nên tạo một lớp trừu tượng mà bộ điều khiển của tôi mở rộng hay tôi nên tạo mô-đun và thêm nó vào mỗi bộ điều khiển? Dưới đây là các phương pháp điều khiển tôi muốn chia sẻ:Thực tiễn tốt nhất để sử dụng lại mã giữa các bộ điều khiển trong Ruby on Rails

def driving_directions 
    @address_to = params[:address_to] 
    @address_from = params[:address_from] 
    @map_center = params[:map_center_start] 

    # if we were not given a center point to start our map on 
    # let's create one. 
    if [email protected]_center && @address_to 
    @map_center = GeoKit::Geocoders::MultiGeocoder.geocode(@address_to).ll 
    elsif [email protected]_center && @address_from 
    @map_center = GeoKit::Geocoders::MultiGeocoder.geocode(@address_from).ll 
    end 
end 

def printer_friendly 
    starting_point = params[:starting_point].split(',').collect{|e|e.to_f} 
    ne = params[:ne].split(',').collect{|e|e.to_f} 
    sw = params[:sw].split(',').collect{|e|e.to_f} 
    size = params[:size].split(',').collect{|e|e.to_f} 
    address = params[:address] 

    @markers = retrieve_points(ne,sw,size,false) 
    @map = initialize_map([[sw[0],sw[1]],[ne[0],ne[1]]],[starting_point[0],starting_point[1]],false,@markers,true) 
    @address_string = address 
end 
+1

Có lý do cụ thể nào để không sử dụng application.rb trong trường hợp này không? –

+4

Chỉ một số bộ điều khiển sẽ sử dụng mã, nhưng không phải tất cả. –

Trả lời

110

Theo tôi, nguyên tắc thiết kế OO bình thường áp dụng:

  • Nếu mã thực sự là một bộ các tiện ích mà không cần truy cập vào đối tượng nhà nước, tôi sẽ xem xét đặt nó trong một mô-đun được gọi là riêng biệt. Ví dụ: nếu mã là tất cả tiện ích lập bản đồ, hãy tạo mô-đun Maps và truy cập các phương pháp như: Maps::driving_directions.
  • Nếu mã cần trạng thái và được sử dụng hoặc có thể được sử dụng trong mọi bộ điều khiển, hãy đặt mã trong ApplicationController.
  • Nếu mã cần trạng thái và được sử dụng trong tập hợp con của tất cả các trình điều khiển có liên quan chặt chẽ và hợp lý (nghĩa là tất cả về bản đồ), hãy tạo lớp cơ sở (class MapController < ApplicationController) và đặt mã được chia sẻ ở đó.
  • Nếu mã cần trạng thái và được sử dụng trong một tập hợp con của tất cả các trình điều khiển không liên quan chặt chẽ, hãy đặt nó vào mô-đun và đưa nó vào bộ điều khiển cần thiết.

Trong trường hợp của bạn, các phương thức cần trạng thái (params), do đó, lựa chọn phụ thuộc vào mối quan hệ hợp lý giữa các trình điều khiển cần nó. Ngoài ra:

Ngoài ra:

  • Sử dụng partials khi có thể cho mã lặp đi lặp lại và một trong hai nơi trong một thư mục chung 'partials' hoặc bao gồm thông qua một đường dẫn cụ thể.
  • Gắn bó với một phương pháp RESTful khi có thể (đối với các phương thức) và nếu bạn thấy mình tạo ra nhiều phương thức không RESTful, hãy xem xét giải nén chúng vào bộ điều khiển riêng của chúng.
15

Tôi thực sự nghĩ rằng một mô-đun là cách tốt nhất để chia sẻ mã giữa các bộ điều khiển. Người giúp đỡ rất tốt nếu bạn muốn chia sẻ mã giữa các lượt xem. Người trợ giúp về cơ bản là các mô-đun được vinh danh, vì vậy nếu bạn không cần truy cập cấp độ xem, tôi đề nghị đặt một mô-đun vào thư mục lib của bạn.

Khi bạn tạo mô-đun, bạn sẽ phải sử dụng câu lệnh include để đưa nó vào bộ điều khiển mong muốn.

http://www.rubyist.net/~slagell/ruby/modules.html

1

Tôi đồng ý với phương pháp mô-đun. Tạo một tệp Ruby riêng trong thư mục lib của bạn và đặt mô-đun vào tệp mới.

Cách rõ ràng nhất là thêm các phương thức vào ApplicationController của bạn, nhưng tôi chắc chắn bạn đã biết điều đó rồi.

0

Một khả năng khác:

Nếu mã thông thường của bạn cần nhà nước và bạn muốn chia sẻ những hành vi giữa các bộ điều khiển, bạn có thể đặt nó trong một lớp ruby ​​cũ đồng bằng ở một trong hai bạn thư mục model hoặc lib. Hãy nhớ rằng các lớp model không cần phải kiên trì mặc dù tất cả các lớp ActiveRecord đều liên tục. Nói cách khác, có thể chấp nhận các lớp học model thoáng qua.

1

nếu bạn muốn chia sẻ mã giữa bộ điều khiển và trình trợ giúp, thì bạn nên thử tạo mô-đun trong thư viện. Bạn có thể sử dụng @template và @controller để truy cập phương thức trong bộ điều khiển và trợ giúp. Kiểm tra để biết thêm chi tiết http://www.shanison.com/?p=305

29

Tôi biết câu hỏi này đã được hỏi 6 năm trước. Chỉ muốn chỉ ra rằng trong Rails 4, bây giờ có những quan tâm về điều khiển, đó là một giải pháp tốt hơn.

0

Tôi thấy rằng một cách hiệu quả để chia sẻ mã giống hệt nhau giữa các bộ điều khiển là có một bộ điều khiển kế thừa từ mã khác (nơi mã đang hoạt động). Tôi đã sử dụng phương pháp này để chia sẻ các phương thức giống nhau được định nghĩa trong bộ điều khiển của tôi với một bộ các bộ điều khiển không gian tên khác.

+1

Sử dụng thừa kế để chia sẻ mã được coi là một mùi mã. Bạn nên tránh nó. Xem http://programmers.stackexchange.com/a/12446. Sử dụng thay vào đó, mô-đun, mối quan tâm hoặc thậm chí [đối tượng dịch vụ] (https://netguru.co/blog/service-objects-in-rails-will-help). – Mio

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