Computer >> Máy Tính >  >> Lập trình >> Ruby

Các mẫu thiết kế Rails:Đối tượng Người trình bày &Dịch vụ

Tại sao chúng ta cần các mẫu thiết kế?

Vấn đề là kiến ​​trúc Rails, Model-View-Controller, cung cấp cho bạn một cấu trúc cơ bản để đưa mã của bạn vào.

Nhưng điều này là chưa đủ.

Các lượt xem của bạn trở nên lớn và đầy logic khi mục tiêu của họ là trình bày thông tin.

Bộ điều khiển của bạn nắm giữ thông tin chi tiết ngoài những gì cần thiết để bộ điều khiển thực hiện công việc thiết yếu của nó.

Giải pháp là gì?

Chúng tôi đã tạo ra hai giải pháp để giải quyết những vấn đề này, dưới dạng các mẫu thiết kế.

  • Mẫu người thuyết trình
  • Mẫu đối tượng dịch vụ

Không phải ai cũng đồng ý về cách triển khai chúng một cách chính xác, nhưng tôi sẽ cung cấp cho bạn phiên bản phù hợp với tôi.

Hãy cùng khám phá những mẫu này!

Cách sử dụng Trình trình bày trong Rails

Chế độ xem dành cho bản trình bày, có nghĩa là HTML, CSS và ERB (Ruby được nhúng).

Không được có ActiveRecord truy vấn trong các chế độ xem.

hầu hết logic nên được loại bỏ nếu bạn muốn chế độ xem của mình sạch sẽ và dễ làm việc nhất có thể.

Theo "logic", ý tôi là đưa ra quyết định với câu lệnh if và toán tử bậc ba

Câu hỏi bây giờ là…

Làm thế nào?

Công cụ đầu tiên của bạn để xử lý logic trong dạng xem là sử dụng trình trợ giúp.

Trợ giúp rất tuyệt vời bất cứ khi nào bạn có một phương pháp định dạng chung mà bạn sử dụng trong nhiều chế độ xem.

Ví dụ :

Hiển thị Markdown, hiển thị ngày tháng ở một định dạng cụ thể, xóa các từ cụ thể khỏi văn bản, v.v.

Như thế này :

module DateHelper
  def date_as_month_and_year(date)
    date.strftime("%B %Y")
  end
end

Bạn có thể lưu mã này trong app/helpers thư mục &date_helper.rb tệp.

Đây là một mẹo :

Luôn chuyển đầu vào vào các phương thức trợ giúp thông qua các đối số, không bao giờ dựa vào các biến phiên bản.

Điều này sẽ giúp bạn đỡ rắc rối.

Phương pháp của trình trợ giúp có giới hạn , đặc biệt nếu bạn sử dụng chúng cho mọi nhu cầu định dạng trong chế độ xem của mình.

Họ có xu hướng xây dựng và thiếu bất kỳ loại tổ chức nào.

Giải pháp sắp ra mắt!

Thay thế các phương thức định dạng và điều kiện phức tạp bằng đối tượng người trình bày

Giả sử bạn có chế độ xem như sau:

<p>
  Post title: <%= post.title.gsub("forbidden word", "") %>

  <%= link_to "Read post", post, class: "w-75 p-3 text-#{post.draft? ? "orange" : "green"} border-#{post.draft? ? "orange" : "green"}" %>
</p>

Cái nhìn khá ngắn phải không?

Nhưng nó cảm thấy rất phức tạp với các toán tử bậc ba này và mã trùng lặp.

Không tốt!

Hãy tạo một lớp người thuyết trình để giải quyết vấn đề này.

Đây là cách thực hiện :

class PostPresenter
  def initialize(post)
    @post = post
  end

  def title_without_forbidden_words
    @post.title.gsub("forbidden word", "")
  end

  def css_color
    @post.draft? ? "orange" : "green"
  end
end

Lưu điều này trong app/presenters/post_presenter.rb , tạo presenters nếu bạn không có.

Bây giờ bạn có thể thay đổi chế độ xem.

Như thế này :

<% presenter = PostPresenter.new(post) %>

<p>
  Post title: <%= presenter.title_without_forbidden_words %>

  <%= link_to "Read post", post, class: "w-75 p-3 text-#{presenter.css_color} border-#{presenter.css_color}" %>
</p>

Bạn hiểu rồi!

  • Chúng tôi đã xóa tất cả logic khỏi chế độ xem
  • Chúng tôi đã thêm các tên có ý nghĩa cho các hoạt động định dạng và ra quyết định
  • Chúng tôi có thể sử dụng lại lớp này trong các chế độ xem khác mà không cần sao chép mã

Đó là cách bạn sử dụng người thuyết trình trong Rails 🙂

Cách sử dụng các đối tượng dịch vụ

Người kiểm soát của bạn chỉ nên cho người khác biết phải làm gì, họ không nên có bất kỳ kiến ​​thức nào về cách gửi Tweet, tính phí khách hàng hoặc tạo tệp PDF.

Các hoạt động này nên được ủy quyền cho một đối tượng dịch vụ.

Đối tượng dịch vụ, như tôi định nghĩa, là một mô-đun Ruby đóng gói logic để hoàn thành một hành động.

Ví dụ :

module TwitterService
  def self.send_welcome_message(twitter_handle)
    client.update("@#{twitter_handle} welcome to 'Oranges & Apples', we hope you enjoy our juicy fruit!")
  end

  def self.client
    @client ||= Twitter::REST::Client.new do |config|
      config.consumer_key        = "..."
      config.consumer_secret     = "..."
      config.access_token        = "..."
      config.access_token_secret = "..."
    end
  end
end

Quy ước là lưu điều này dưới một app/services thư mục và một tệp như twitter_service.rb .

Bạn sử dụng cái này như thế nào?

Vì Rails tự động tải mọi thứ từ app/ , mã này sẽ có sẵn trong bộ điều khiển của bạn.

Ví dụ :

class UsersController
  def create
    # ...
    TwitterService.send_welcome_message(user.twitter_handle)
  end
end

Đó là mẫu đối tượng dịch vụ đang hoạt động.

Tóm tắt

Bạn đã học được hai mẫu Rails hữu ích sẽ giúp bạn cải thiện chất lượng mã của dự án khi được sử dụng một cách khôn ngoan!

Bây giờ đến lượt bạn áp dụng chúng 🙂

Cảm ơn vì đã đọc.