Các phương pháp hay nhất để sử dụng lại mã giữa các bộ điều khiển trong Ruby on Rails


82

Tôi có một số phương pháp điều khiển muốn chia sẻ. Cách 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 mà tôi muốn chia sẻ:

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 !@map_center && @address_to
    @map_center = GeoKit::Geocoders::MultiGeocoder.geocode(@address_to).ll
  elsif !@map_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?
PJ.

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

Câu trả lời:


113

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

  • Nếu mã thực sự là một tập hợp các tiện ích không cần quyền truy cập vào trạng thái đối tượng, tôi sẽ cân nhắc đặt nó vào một mô-đun để được gọi riêng. Ví dụ, nếu mã được tất cả các tiện ích lập bản đồ, tạo ra một mô-đun Maps, và truy cập vào 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ã vào ApplicationController.
  • 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 bộ điều khiển có liên quan chặt chẽ và logic (tức là tất cả về bản đồ) thì hãy tạo một 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 bộ điều khiển không có liên quan chặt chẽ với nhau, hãy đặt nó vào một mô-đun và đưa nó vào các 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 state ( params), vì vậy sự lựa chọn phụ thuộc vào mối quan hệ logic giữa các bộ điều khiển cần nó. Ngoài ra:

Cũng thế:

  • Sử dụng các phần tử nếu có thể cho mã lặp lại và đặt trong thư mục 'phần tử' chung hoặc bao gồm thông qua một đường dẫn cụ thể.
  • Bám sát cách tiếp cận RESTful khi có thể (đối với các phương thức) và nếu bạn thấy mình đang 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 của riêng chúng.

33

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


16

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 trợ giúp rất tốt nếu bạn muốn chia sẻ mã giữa các chế độ xem. Người trợ giúp về cơ bản là các mô-đun được tôn vinh, vì vậy nếu bạn không cần quyền truy cập mức xem, tôi khuyên bạn nên đặ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 cách tiếp cận mô-đun. Tạo một tệp Ruby riêng biệt 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 rằng bạn đã biết điều đó.


1

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


0

Khả năng khác:

Nếu mã chung của bạn cần trạng thái và bạn muốn chia sẻ 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ũ đơn giản trong thư mục modelhoặc của bạn lib. Hãy nhớ rằng modelcác lớp không nhất thiết phải liên tục mặc dù tất cả các lớp ActiveRecord đều ổn định. Nói cách khác, có thể chấp nhận được modelcác lớp tạm thời .


0

Tôi nhận 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ừ bộ điều khiển kia (nơi mã tồn tại). Tôi đã sử dụng cách tiếp cận này để chia sẻ các phương pháp giống hệt nhau được xác định trong bộ điều khiển của tôi với một tập hợp bộ điều khiển không gian tên khác.


1
Sử dụng kế thừa để chia sẻ mã được coi như một mùi mã. Bạn nên tránh nó. Xem programmers.stackexchange.com/a/12446 . Sử dụng thay thế, các mô-đun, mối quan tâm hoặc thậm chí các dịch vụ đối tượng .
Mio
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.