Javascript chuyển hướng trang hiện tại

Hướng dẫn này tập trung vào sự tương tác giữa Controller và View trong tam giác Model-View-Controller. Như bạn đã biết, Bộ điều khiển chịu trách nhiệm điều phối toàn bộ quá trình xử lý yêu cầu trong Rails, mặc dù nó thường chuyển bất kỳ mã nặng nào cho Mô hình. Nhưng sau đó, khi đến lúc gửi phản hồi lại cho người dùng, Bộ điều khiển sẽ chuyển giao mọi thứ cho Chế độ xem. Đó là bàn giao đó là chủ đề của hướng dẫn này

Nói một cách khái quát, điều này liên quan đến việc quyết định cái gì sẽ được gửi dưới dạng phản hồi và gọi một phương thức thích hợp để tạo phản hồi đó. Nếu phản hồi là một chế độ xem toàn diện, Rails cũng thực hiện thêm một số công việc để bao bọc chế độ xem trong một bố cục và có thể kéo vào một phần chế độ xem. Bạn sẽ thấy tất cả những con đường đó sau trong hướng dẫn này

Từ quan điểm của bộ điều khiển, có ba cách để tạo phản hồi HTTP

  • Gọi để tạo phản hồi đầy đủ để gửi lại cho trình duyệt
  • Gọi để gửi mã trạng thái chuyển hướng HTTP tới trình duyệt
  • Gọi để tạo phản hồi chỉ bao gồm các tiêu đề HTTP để gửi lại cho trình duyệt

Bạn đã nghe nói rằng Rails khuyến khích "quy ước về cấu hình". Kết xuất mặc định là một ví dụ tuyệt vời về điều này. Theo mặc định, các bộ điều khiển trong Rails sẽ tự động hiển thị các chế độ xem có tên tương ứng với các tuyến hợp lệ. Ví dụ: nếu bạn có mã này trong lớp

Books are coming soon!
03 của mình

class BooksController < ApplicationController
end
Bản sao

Và sau đây trong tập tin tuyến đường của bạn

Và bạn có một tập tin xem

Books are coming soon!
04

Books are coming soon!
Bản sao

Rails sẽ tự động hiển thị

Books are coming soon!
04 khi bạn điều hướng đến
Books are coming soon!
06 và bạn sẽ thấy "Sách sắp ra mắt. " trên màn hình của bạn

Tuy nhiên, màn hình sắp ra mắt chỉ hữu ích ở mức tối thiểu, vì vậy bạn sẽ sớm tạo mô hình

Books are coming soon!
07 của mình và thêm hành động chỉ mục vào
Books are coming soon!
03

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
Bản sao

Lưu ý rằng chúng tôi không hiển thị rõ ràng ở cuối hành động chỉ mục theo nguyên tắc "quy ước về cấu hình". Quy tắc là nếu bạn không hiển thị rõ ràng thứ gì đó ở cuối hành động của bộ điều khiển, Rails sẽ tự động tìm mẫu

Books are coming soon!
09 trong đường dẫn chế độ xem của bộ điều khiển và hiển thị nó. Vì vậy, trong trường hợp này, Rails sẽ kết xuất tệp
Books are coming soon!
04

Nếu chúng tôi muốn hiển thị các thuộc tính của tất cả sách trong chế độ xem của mình, chúng tôi có thể làm như vậy với mẫu ERB như thế này

class BooksController < ApplicationController
end
1Bản sao

Kết xuất thực tế được thực hiện bởi các lớp lồng nhau của mô-đun

Books are coming soon!
11. Hướng dẫn này không đi sâu vào quy trình đó, nhưng điều quan trọng cần biết là phần mở rộng tệp trên chế độ xem của bạn kiểm soát việc lựa chọn trình xử lý mẫu

Trong hầu hết các trường hợp, phương pháp này thực hiện rất nhiều việc hiển thị nội dung ứng dụng của bạn để trình duyệt sử dụng. Có nhiều cách khác nhau để tùy chỉnh hành vi của

Books are coming soon!
00. Bạn có thể hiển thị chế độ xem mặc định cho mẫu Rails hoặc mẫu cụ thể hoặc tệp hoặc mã nội tuyến hoặc không có gì cả. Bạn có thể hiển thị văn bản, JSON hoặc XML. Bạn cũng có thể chỉ định loại nội dung hoặc trạng thái HTTP của phản hồi được hiển thị

Nếu bạn muốn xem kết quả chính xác của lệnh gọi tới

Books are coming soon!
00 mà không cần kiểm tra nó trong trình duyệt, bạn có thể gọi tới
Books are coming soon!
16. Phương thức này có các tùy chọn chính xác giống như
Books are coming soon!
00, nhưng nó trả về một chuỗi thay vì gửi phản hồi trở lại trình duyệt

Nếu bạn muốn hiển thị chế độ xem tương ứng với một mẫu khác trong cùng bộ điều khiển, bạn có thể sử dụng

Books are coming soon!
00 với tên của chế độ xem

class BooksController < ApplicationController
end
8Bản sao

Nếu cuộc gọi đến

Books are coming soon!
19 không thành công, việc gọi hành động
Books are coming soon!
19 trong bộ điều khiển này sẽ hiển thị mẫu
Books are coming soon!
21 thuộc cùng một bộ điều khiển

Nếu muốn, bạn có thể sử dụng ký hiệu thay vì chuỗi để chỉ định hành động sẽ hiển thị

Books are coming soon!
2Bản sao

Điều gì sẽ xảy ra nếu bạn muốn hiển thị mẫu từ bộ điều khiển hoàn toàn khác với mẫu chứa mã hành động? . Ví dụ: nếu bạn đang chạy mã trong một

Books are coming soon!
24 sống trong
Books are coming soon!
25, bạn có thể hiển thị kết quả của một hành động cho một mẫu trong
Books are coming soon!
26 theo cách này

Books are coming soon!
8Bản sao

Rails biết rằng chế độ xem này thuộc về một bộ điều khiển khác do ký tự gạch chéo được nhúng trong chuỗi. Nếu muốn rõ ràng, bạn có thể sử dụng tùy chọn

Books are coming soon!
27 (được yêu cầu trên Rails 2. 2 trở về trước)

Books are coming soon!
0Bản sao

Hai cách kết xuất ở trên (hiển thị mẫu của một hành động khác trong cùng một bộ điều khiển và hiển thị mẫu của một hành động khác trong một bộ điều khiển khác) thực sự là các biến thể của cùng một thao tác

Trên thực tế, trong lớp

Books are coming soon!
03, bên trong hành động cập nhật nơi chúng tôi muốn hiển thị mẫu chỉnh sửa nếu sách không cập nhật thành công, tất cả các lệnh gọi kết xuất sau đây đều sẽ hiển thị mẫu
Books are coming soon!
21 trong thư mục
Books are coming soon!
30

Books are coming soon!
4Bản sao

Cái nào bạn sử dụng thực sự là một vấn đề về phong cách và quy ước, nhưng quy tắc ngón tay cái là sử dụng cái đơn giản nhất có ý nghĩa đối với mã bạn đang viết

Phương thức

Books are coming soon!
00 có thể thực hiện hoàn toàn mà không cần chế độ xem, nếu bạn sẵn sàng sử dụng tùy chọn
Books are coming soon!
32 để cung cấp ERB như một phần của lệnh gọi phương thức. Điều này là hoàn toàn hợp lệ

Books are coming soon!
7Bản sao

Hiếm khi có bất kỳ lý do chính đáng nào để sử dụng tùy chọn này. Trộn ERB vào bộ điều khiển của bạn sẽ đánh bại định hướng MVC của Rails và sẽ khiến các nhà phát triển khác khó tuân theo logic của dự án của bạn hơn. Thay vào đó, hãy sử dụng chế độ xem erb riêng biệt

Theo mặc định, hiển thị nội tuyến sử dụng ERB. Bạn có thể buộc nó sử dụng Builder thay thế bằng tùy chọn

Books are coming soon!
35

Books are coming soon!
0Bản sao

Bạn có thể gửi văn bản thuần túy - hoàn toàn không có đánh dấu - trở lại trình duyệt bằng cách sử dụng tùy chọn

Books are coming soon!
36 đến
Books are coming soon!
00

Hiển thị văn bản thuần túy hữu ích nhất khi bạn đang phản hồi các yêu cầu dịch vụ web hoặc Ajax đang mong đợi một thứ gì đó không phải là HTML phù hợp

Theo mặc định, nếu bạn sử dụng tùy chọn

Books are coming soon!
36, văn bản sẽ được hiển thị mà không sử dụng bố cục hiện tại. Nếu bạn muốn Rails đưa văn bản vào bố cục hiện tại, bạn cần thêm tùy chọn
Books are coming soon!
39 và sử dụng phần mở rộng
Books are coming soon!
40 cho tệp bố cục

Bạn có thể gửi một chuỗi HTML trở lại trình duyệt bằng cách sử dụng tùy chọn

Books are coming soon!
41 để gửi tới
Books are coming soon!
00

Books are coming soon!
1Bản sao

Điều này hữu ích khi bạn đang hiển thị một đoạn mã HTML nhỏ. Tuy nhiên, bạn có thể cân nhắc chuyển nó sang tệp mẫu nếu đánh dấu phức tạp

Khi sử dụng tùy chọn

Books are coming soon!
43, các thực thể HTML sẽ được thoát nếu chuỗi không được tạo bằng API nhận biết
Books are coming soon!
44

JSON là một định dạng dữ liệu JavaScript được nhiều thư viện Ajax sử dụng. Rails có hỗ trợ tích hợp để chuyển đổi các đối tượng thành JSON và hiển thị JSON đó trở lại trình duyệt

Bạn không cần gọi

Books are coming soon!
45 trên đối tượng mà bạn muốn kết xuất. Nếu bạn sử dụng tùy chọn
Books are coming soon!
46,
Books are coming soon!
00 sẽ tự động gọi
Books are coming soon!
45 cho bạn

Rails cũng có hỗ trợ tích hợp để chuyển đổi các đối tượng thành XML và hiển thị XML đó trở lại trình gọi

Bạn không cần gọi

Books are coming soon!
49 trên đối tượng mà bạn muốn kết xuất. Nếu bạn sử dụng tùy chọn
Books are coming soon!
50,
Books are coming soon!
00 sẽ tự động gọi
Books are coming soon!
49 cho bạn

Rails có thể hiển thị vanilla JavaScript

Books are coming soon!
2Bản sao

Điều này sẽ gửi chuỗi được cung cấp tới trình duyệt với loại MIME là

Books are coming soon!
53

Bạn có thể gửi nội dung thô trở lại trình duyệt mà không cần đặt bất kỳ loại nội dung nào bằng cách sử dụng tùy chọn

Books are coming soon!
54 thành
Books are coming soon!
00

Tùy chọn này chỉ nên được sử dụng nếu bạn không quan tâm đến loại nội dung của phản hồi. Hầu hết thời gian sử dụng

Books are coming soon!
36 hoặc
Books are coming soon!
41 có thể phù hợp hơn

Trừ khi bị ghi đè, phản hồi của bạn được trả về từ tùy chọn kết xuất này sẽ là

Books are coming soon!
58, vì đó là loại nội dung mặc định của phản hồi Gửi hành động

Rails có thể kết xuất một tệp thô từ một đường dẫn tuyệt đối. Điều này hữu ích để hiển thị có điều kiện các tệp tĩnh như các trang lỗi

Books are coming soon!
3Bản sao

Điều này hiển thị tệp thô (nó không hỗ trợ ERB hoặc các trình xử lý khác). Theo mặc định, nó được hiển thị trong bố cục hiện tại

Sử dụng tùy chọn

Books are coming soon!
59 kết hợp với đầu vào của người dùng có thể dẫn đến các sự cố bảo mật vì kẻ tấn công có thể sử dụng hành động này để truy cập các tệp nhạy cảm về bảo mật trong hệ thống tệp của bạn

Books are coming soon!
60 thường là tùy chọn nhanh hơn và tốt hơn nếu không yêu cầu bố cục

Đường ray có thể hiển thị các đối tượng phản hồi

Books are coming soon!
61

Books are coming soon!
4Bản sao

Điều này gọi

Books are coming soon!
62 trên đối tượng được cung cấp với bối cảnh xem hiện tại

Các cuộc gọi đến phương thức thường chấp nhận sáu tùy chọn

  • Books are coming soon!
    
    65
  • Books are coming soon!
    
    66
  • Books are coming soon!
    
    67
  • Books are coming soon!
    
    68
  • Books are coming soon!
    
    69
  • Books are coming soon!
    
    70
2. 2. 13. 1 Tùy chọn
Books are coming soon!
65

Theo mặc định, Rails sẽ cung cấp kết quả của thao tác kết xuất với loại nội dung MIME là

Books are coming soon!
72 (hoặc
Books are coming soon!
73 nếu bạn sử dụng tùy chọn
Books are coming soon!
46 hoặc
Books are coming soon!
75 cho tùy chọn
Books are coming soon!
50. ). Đôi khi bạn có thể muốn thay đổi điều này và bạn có thể làm như vậy bằng cách đặt tùy chọn
Books are coming soon!
65

Books are coming soon!
5Bản sao

2. 2. 13. 2 Tùy chọn
Books are coming soon!
66

Với hầu hết các tùy chọn cho

Books are coming soon!
00, nội dung hiển thị được hiển thị như một phần của bố cục hiện tại. Bạn sẽ tìm hiểu thêm về bố cục và cách sử dụng chúng sau trong hướng dẫn này

Bạn có thể sử dụng tùy chọn

Books are coming soon!
66 để yêu cầu Rails sử dụng một tệp cụ thể làm bố cục cho hành động hiện tại

Books are coming soon!
6Bản sao

Bạn cũng có thể yêu cầu Rails kết xuất mà không có bố cục nào cả

Bạn có thể sử dụng tùy chọn

Books are coming soon!
67 để đặt tiêu đề HTTP
Books are coming soon!
82

Books are coming soon!
7Bản sao

2. 2. 13. 4 Tùy chọn
Books are coming soon!
68

Rails sẽ tự động tạo phản hồi với mã trạng thái HTTP chính xác (trong hầu hết các trường hợp, đây là

Books are coming soon!
84). Bạn có thể sử dụng tùy chọn
Books are coming soon!
68 để thay đổi điều này

Books are coming soon!
8Bản sao

Rails hiểu cả mã trạng thái số và các ký hiệu tương ứng được hiển thị bên dưới

Lớp phản hồi Mã trạng thái HTTP Biểu tượngThông tin100. tiếp tục101. switching_protocols102. xử lýSuccess200. được201. đã tạo202. chấp nhận203. non_authoritative_information204. no_content205. đặt lại_content206. một phần_content207. multi_status208. đã_reported226. im_usedRedirection300. nhiều_choices301. đã di chuyển_vĩnh viễn 302. tìm thấy303. xem_other304. not_modified305. sử dụng_proxy307. chuyển hướng tạm thời 308. chuyển hướng vĩnh viễn Lỗi máy khách 400. bad_request401. trái phép402. thanh toán_required403. bị cấm404. not_found405. method_not_allowed 406. not_acceptable407. proxy_authentication_required408. request_timeout409. xung đột410. đi411. chiều dài_required412. điều kiện tiên quyết_failed413. payload_too_large 414. uri_too_long415. unsupported_media_type416. range_not_satisfiable417. kỳ vọng_failed421. yêu cầu sai hướng 422. thực thể không xử lý được 423. khóa424. fail_dependency426. nâng cấp_required428. điều kiện tiên quyết_required429. too_many_requests 431. request_header_fields_too_large451. không khả dụng vì lý do pháp lý Lỗi máy chủ 500. internal_server_error 501. not_implemented502. bad_gateway503. dịch vụ_không khả dụng 504. gateway_timeout505. http_version_not_supported506. biến thể_cũng_negotiates507. không đủ_storage508. loop_detected510. not_extend511. network_authentication_required

Nếu bạn cố hiển thị nội dung cùng với mã trạng thái không phải nội dung (100-199, 204, 205 hoặc 304), nội dung đó sẽ bị loại khỏi phản hồi

2. 2. 13. 5 Tùy chọn
Books are coming soon!
69

Rails sử dụng định dạng được chỉ định trong yêu cầu (hoặc

Books are coming soon!
41 theo mặc định). Bạn có thể thay đổi điều này thông qua tùy chọn
Books are coming soon!
69 bằng một ký hiệu hoặc một mảng

Books are coming soon!
9Bản sao

Nếu một mẫu có định dạng được chỉ định không tồn tại, lỗi

Books are coming soon!
89 sẽ xuất hiện

2. 2. 13. 6 Tùy chọn
Books are coming soon!
70

Điều này yêu cầu Rails tìm kiếm các biến thể mẫu có cùng định dạng. Bạn có thể chỉ định danh sách các biến thể bằng cách chuyển tùy chọn

Books are coming soon!
70 bằng một ký hiệu hoặc một mảng

Một ví dụ về việc sử dụng sẽ là thế này

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
0Bản sao

Với tập hợp các biến thể này, Rails sẽ tìm kiếm tập hợp các mẫu sau và sử dụng mẫu đầu tiên tồn tại

  • Books are coming soon!
    
    92
  • Books are coming soon!
    
    93
  • Books are coming soon!
    
    94

Nếu một mẫu có định dạng được chỉ định không tồn tại, lỗi

Books are coming soon!
89 sẽ xuất hiện

Thay vì đặt biến thể trên lệnh gọi kết xuất, bạn cũng có thể đặt nó trên đối tượng yêu cầu trong hành động điều khiển của mình

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
1Bản sao

Để tìm bố cục hiện tại, trước tiên Rails tìm một tệp trong

Books are coming soon!
96 có cùng tên cơ sở với bộ điều khiển. Ví dụ: các hành động hiển thị từ lớp
Books are coming soon!
97 sẽ sử dụng
Books are coming soon!
98 (hoặc
Books are coming soon!
99). Nếu không có bố cục dành riêng cho bộ điều khiển như vậy, Rails sẽ sử dụng
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
00 hoặc
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
01. Nếu không có bố cục
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
02, Rails sẽ sử dụng bố cục
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
03 nếu có. Rails cũng cung cấp một số cách để gán chính xác hơn các bố cục cụ thể cho các bộ điều khiển và hành động riêng lẻ

2. 2. 14. 1 Chỉ định Bố cục cho Bộ điều khiển

Bạn có thể ghi đè các quy ước bố cục mặc định trong bộ điều khiển của mình bằng cách sử dụng khai báo. Ví dụ

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
2Bản sao

Với tuyên bố này, tất cả các chế độ xem được hiển thị bởi

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
05 sẽ sử dụng
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
06 làm bố cục của chúng

Để chỉ định bố cục cụ thể cho toàn bộ ứng dụng, hãy sử dụng khai báo

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
04 trong lớp
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
08 của bạn

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
3Bản sao

Với tuyên bố này, tất cả các chế độ xem trong toàn bộ ứng dụng sẽ sử dụng

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
09 cho bố cục của chúng

Bạn có thể sử dụng một biểu tượng để trì hoãn lựa chọn bố cục cho đến khi yêu cầu được xử lý

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
4Bản sao

Bây giờ, nếu người dùng hiện tại là người dùng đặc biệt, họ sẽ có bố cục đặc biệt khi xem sản phẩm

Bạn thậm chí có thể sử dụng một phương pháp nội tuyến, chẳng hạn như Proc, để xác định bố cục. Ví dụ: nếu bạn chuyển một đối tượng Proc, khối bạn cung cấp cho Proc sẽ được cung cấp phiên bản

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
10, vì vậy bố cục có thể được xác định dựa trên yêu cầu hiện tại

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
5Bản sao

2. 2. 14. 3 bố cục có điều kiện

Bố cục được chỉ định ở cấp bộ điều khiển hỗ trợ các tùy chọn

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
11 và
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
12. Các tùy chọn này lấy tên phương thức hoặc một mảng tên phương thức, tương ứng với tên phương thức trong bộ điều khiển

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
6Bản sao

Với khai báo này, bố cục

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
13 sẽ được sử dụng cho mọi thứ trừ các phương thức
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
14 và
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
15

2. 2. 14. 4 Kế thừa bố cục

Các khai báo bố cục xếp tầng xuống trong cấu trúc phân cấp và các khai báo bố cục cụ thể hơn luôn ghi đè lên các khai báo chung hơn. Ví dụ

  • class BooksController < ApplicationController
      def index
        @books = Book.all
      end
    end
    
    16

    class BooksController < ApplicationController
      def index
        @books = Book.all
      end
    end
    
    7Bản sao

  • class BooksController < ApplicationController
      def index
        @books = Book.all
      end
    end
    
    17

    class BooksController < ApplicationController
      def index
        @books = Book.all
      end
    end
    
    8Bản sao

  • class BooksController < ApplicationController
      def index
        @books = Book.all
      end
    end
    
    18

    class BooksController < ApplicationController
      def index
        @books = Book.all
      end
    end
    
    9Bản sao

  • class BooksController < ApplicationController
      def index
        @books = Book.all
      end
    end
    
    19

    class BooksController < ApplicationController
    end
    
    10Bản sao

trong ứng dụng này

  • Nói chung, các khung nhìn sẽ được hiển thị trong bố cục
    class BooksController < ApplicationController
      def index
        @books = Book.all
      end
    end
    
    20
  • class BooksController < ApplicationController
      def index
        @books = Book.all
      end
    end
    
    21 sẽ sử dụng bố cục
    class BooksController < ApplicationController
      def index
        @books = Book.all
      end
    end
    
    20
  • class BooksController < ApplicationController
      def index
        @books = Book.all
      end
    end
    
    23 sẽ sử dụng bố cục
    class BooksController < ApplicationController
      def index
        @books = Book.all
      end
    end
    
    24
  • class BooksController < ApplicationController
      def index
        @books = Book.all
      end
    end
    
    25 sẽ không sử dụng bố cục nào cả
  • class BooksController < ApplicationController
      def index
        @books = Book.all
      end
    end
    
    26 sẽ sử dụng bố cục
    class BooksController < ApplicationController
      def index
        @books = Book.all
      end
    end
    
    27
2. 2. 14. 5 Kế thừa mẫu

Tương tự như logic Kế thừa bố cục, nếu không tìm thấy mẫu hoặc một phần trong đường dẫn thông thường, bộ điều khiển sẽ tìm một mẫu hoặc một phần để hiển thị trong chuỗi thừa kế của nó. Ví dụ

class BooksController < ApplicationController
end
11Bản sao

class BooksController < ApplicationController
end
12Bản sao

class BooksController < ApplicationController
end
13Bản sao

Thứ tự tra cứu cho một hành động

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
28 sẽ là

  • class BooksController < ApplicationController
      def index
        @books = Book.all
      end
    end
    
    29
  • class BooksController < ApplicationController
      def index
        @books = Book.all
      end
    end
    
    30
  • class BooksController < ApplicationController
      def index
        @books = Book.all
      end
    end
    
    31

Điều này làm cho

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
31 trở thành một nơi tuyệt vời cho các phần được chia sẻ của bạn, sau đó có thể được hiển thị trong ERB của bạn như vậy

class BooksController < ApplicationController
end
14Bản sao

Không sớm thì muộn, hầu hết các nhà phát triển Rails sẽ thấy thông báo lỗi "Chỉ có thể kết xuất hoặc chuyển hướng một lần cho mỗi hành động". Mặc dù điều này gây khó chịu, nhưng nó tương đối dễ khắc phục. Thông thường nó xảy ra do hiểu lầm cơ bản về cách thức hoạt động của

Books are coming soon!
00

Ví dụ: đây là một số mã sẽ gây ra lỗi này

class BooksController < ApplicationController
end
15Bản sao

Nếu

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
34 đánh giá thành
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
35, Rails sẽ bắt đầu quá trình kết xuất để kết xuất biến
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
36 vào chế độ xem
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
37. Nhưng điều này sẽ không ngăn phần còn lại của mã trong hành động
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
38 chạy và khi Rails kết thúc hành động, nó sẽ bắt đầu hiển thị chế độ xem
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
39 - và gây ra lỗi. Giải pháp rất đơn giản. đảm bảo rằng bạn chỉ có một cuộc gọi đến
Books are coming soon!
00 hoặc
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
41 trong một đường dẫn mã duy nhất. Một điều có thể giúp ích là
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
42. Đây là một phiên bản vá của phương pháp

class BooksController < ApplicationController
end
16Bản sao

Đảm bảo sử dụng

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
42 thay vì
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
44 vì
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
44 sẽ không hoạt động do ưu tiên của toán tử trong Ngôn ngữ Ruby

Lưu ý rằng kết xuất ẩn được thực hiện bởi ActionController sẽ phát hiện nếu

Books are coming soon!
00 đã được gọi, vì vậy phần sau sẽ hoạt động mà không có lỗi

class BooksController < ApplicationController
end
17Bản sao

Thao tác này sẽ hiển thị sách có

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
47 được đặt theo mẫu
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
37, trong khi các sách khác sẽ hiển thị theo mẫu
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
38 mặc định

Một cách khác để xử lý các phản hồi trả về cho một yêu cầu HTTP là sử dụng. Như bạn đã thấy,

Books are coming soon!
00 cho Rails biết nên sử dụng chế độ xem nào (hoặc nội dung khác) để xây dựng phản hồi. Phương thức
Books are coming soon!
01 thực hiện điều gì đó hoàn toàn khác. nó yêu cầu trình duyệt gửi một yêu cầu mới cho một URL khác. Ví dụ: bạn có thể chuyển hướng từ bất kỳ vị trí nào trong mã của mình đến chỉ mục ảnh trong ứng dụng của mình bằng lệnh gọi này

class BooksController < ApplicationController
end
18Bản sao

Bạn có thể sử dụng để đưa người dùng trở lại trang mà họ vừa truy cập. Vị trí này được lấy từ tiêu đề

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
55 không đảm bảo được đặt bởi trình duyệt, vì vậy bạn phải cung cấp
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
56 để sử dụng trong trường hợp này

class BooksController < ApplicationController
end
19Bản sao

Books are coming soon!
01 và
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
54 không tạm dừng và quay lại ngay lập tức từ quá trình thực thi phương thức mà chỉ cần đặt các phản hồi HTTP. Các câu lệnh xảy ra sau chúng trong một phương thức sẽ được thực thi. Bạn có thể tạm dừng bằng một
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
59 rõ ràng hoặc một số cơ chế tạm dừng khác, nếu cần

Rails sử dụng mã trạng thái HTTP 302, một chuyển hướng tạm thời, khi bạn gọi

Books are coming soon!
01. Nếu bạn muốn sử dụng mã trạng thái khác, có thể là 301, chuyển hướng vĩnh viễn, bạn có thể sử dụng tùy chọn
Books are coming soon!
68

class BooksController < ApplicationController
end
80Bản sao

Giống như tùy chọn

Books are coming soon!
68 cho
Books are coming soon!
00,
Books are coming soon!
68 cho
Books are coming soon!
01 chấp nhận cả ký hiệu tiêu đề số và ký hiệu

Đôi khi các nhà phát triển thiếu kinh nghiệm nghĩ về

Books are coming soon!
01 như một loại lệnh
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
69, chuyển việc thực thi từ nơi này sang nơi khác trong mã Rails của bạn. Điều này LAF không đúng. Mã của bạn ngừng chạy và chờ yêu cầu mới từ trình duyệt. Điều đó xảy ra là bạn đã cho trình duyệt biết yêu cầu nào sẽ thực hiện tiếp theo, bằng cách gửi lại mã trạng thái HTTP 302

Hãy xem xét những hành động này để thấy sự khác biệt

class BooksController < ApplicationController
end
81Bản sao

Với code ở dạng này, rất có thể sẽ xảy ra vấn đề nếu biến

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
36 là
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
71. Hãy nhớ rằng, một
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
72 không chạy bất kỳ mã nào trong hành động đích, vì vậy sẽ không có gì thiết lập biến
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
73 mà chế độ xem
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
15 có thể sẽ yêu cầu. Một cách để khắc phục điều này là chuyển hướng thay vì hiển thị

class BooksController < ApplicationController
end
82Bản sao

Với mã này, trình duyệt sẽ tạo một yêu cầu mới cho trang chỉ mục, mã trong phương thức

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
15 sẽ chạy và tất cả sẽ ổn

Nhược điểm duy nhất của mã này là nó yêu cầu một chuyến đi khứ hồi tới trình duyệt. trình duyệt đã yêu cầu hiển thị hành động với

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
76 và bộ điều khiển nhận thấy rằng không có sách nào, vì vậy bộ điều khiển gửi phản hồi chuyển hướng 302 tới trình duyệt yêu cầu nó chuyển đến
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
77, trình duyệt tuân thủ và gửi yêu cầu mới trở lại bộ điều khiển yêu cầu

Mặc dù trong một ứng dụng nhỏ, độ trễ được thêm vào này có thể không phải là vấn đề, nhưng đây là điều cần suy nghĩ nếu thời gian phản hồi là vấn đề đáng lo ngại. Chúng ta có thể chứng minh một cách để xử lý vấn đề này bằng một ví dụ giả định

class BooksController < ApplicationController
end
83Bản sao

Điều này sẽ phát hiện ra rằng không có sách nào có ID được chỉ định, điền vào biến đối tượng

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
73 với tất cả các sách trong mô hình, sau đó hiển thị trực tiếp mẫu
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
80, trả lại mẫu đó cho trình duyệt bằng một thông báo cảnh báo flash để cho người dùng biết điều gì đã xảy ra

Phương pháp này có thể được sử dụng để gửi phản hồi chỉ với các tiêu đề tới trình duyệt. Phương thức

Books are coming soon!
02 chấp nhận một số hoặc ký hiệu (xem ) đại diện cho mã trạng thái HTTP. Đối số tùy chọn được hiểu là hàm băm của tên và giá trị tiêu đề. Ví dụ: bạn chỉ có thể trả về một tiêu đề lỗi

Điều này sẽ tạo ra tiêu đề sau

class BooksController < ApplicationController
end
84Bản sao

Hoặc bạn có thể sử dụng các tiêu đề HTTP khác để truyền tải thông tin khác

class BooksController < ApplicationController
end
85Bản sao

Mà sẽ sản xuất

class BooksController < ApplicationController
end
86Bản sao

Khi Rails hiển thị một chế độ xem dưới dạng phản hồi, nó sẽ làm như vậy bằng cách kết hợp chế độ xem với bố cục hiện tại, sử dụng các quy tắc để tìm bố cục hiện tại đã được đề cập trước đó trong hướng dẫn này. Trong một bố cục, bạn có quyền truy cập vào ba công cụ để kết hợp các bit đầu ra khác nhau để tạo thành phản hồi tổng thể

Trình trợ giúp thẻ nội dung cung cấp các phương thức tạo HTML liên kết lượt xem với nguồn cấp dữ liệu, JavaScript, biểu định kiểu, hình ảnh, video và âm thanh. Có sáu trình trợ giúp thẻ nội dung có sẵn trong Rails

Bạn có thể sử dụng các thẻ này trong bố cục hoặc các chế độ xem khác, mặc dù

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
83,
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
84 và
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
85, được sử dụng phổ biến nhất trong phần của bố cục

Trình trợ giúp thẻ nội dung không xác minh sự tồn tại của nội dung tại các vị trí đã chỉ định;

Trình trợ giúp xây dựng HTML mà hầu hết các trình duyệt và trình đọc nguồn cấp dữ liệu có thể sử dụng để phát hiện sự hiện diện của nguồn cấp dữ liệu RSS, Atom hoặc JSON. Nó lấy loại liên kết (

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
88,
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
89 hoặc
Books are coming soon!
46), một hàm băm của các tùy chọn được chuyển qua url_for và một hàm băm của các tùy chọn cho thẻ

class BooksController < ApplicationController
end
87Bản sao

Có ba tùy chọn thẻ có sẵn cho

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
83

  • class BooksController < ApplicationController
      def index
        @books = Book.all
      end
    end
    
    92 chỉ định giá trị
    class BooksController < ApplicationController
      def index
        @books = Book.all
      end
    end
    
    93 trong liên kết. Giá trị mặc định là "thay thế"
  • Books are coming soon!
    
    35 chỉ định loại MIME rõ ràng. Rails sẽ tự động tạo ra một loại MIME phù hợp
  • class BooksController < ApplicationController
      def index
        @books = Book.all
      end
    end
    
    95 chỉ định tiêu đề của liên kết. Giá trị mặc định là giá trị
    Books are coming soon!
    
    35 viết hoa, ví dụ: "ATOM" hoặc "RSS"

Trình trợ giúp trả về thẻ HTML

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
99 cho mỗi nguồn được cung cấp

Nếu bạn đang sử dụng Rails với Asset Pipeline được bật, trình trợ giúp này sẽ tạo liên kết đến

class BooksController < ApplicationController
end
100 thay vì
class BooksController < ApplicationController
end
101 được sử dụng trong các phiên bản trước của Rails. Liên kết này sau đó được cung cấp bởi đường ống nội dung

Tệp JavaScript trong ứng dụng Rails hoặc công cụ Rails đi vào một trong ba vị trí.

class BooksController < ApplicationController
end
102,
class BooksController < ApplicationController
end
103 hoặc
class BooksController < ApplicationController
end
104. Những vị trí này được giải thích chi tiết trong

Bạn có thể chỉ định một đường dẫn đầy đủ liên quan đến gốc tài liệu hoặc một URL nếu bạn thích. Ví dụ: để liên kết đến tệp JavaScript bên trong thư mục có tên là

class BooksController < ApplicationController
end
105 bên trong một trong số
class BooksController < ApplicationController
end
102,
class BooksController < ApplicationController
end
103 hoặc
class BooksController < ApplicationController
end
104, bạn sẽ làm điều này

class BooksController < ApplicationController
end
88Bản sao

Sau đó, Rails sẽ xuất một thẻ

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
99 như thế này

class BooksController < ApplicationController
end
89Bản sao

Yêu cầu đối với nội dung này sau đó được phục vụ bởi đá quý Sprockets

Để bao gồm nhiều tệp như

class BooksController < ApplicationController
end
110 và
class BooksController < ApplicationController
end
111 cùng một lúc

Books are coming soon!
20Bản sao

Bao gồm

class BooksController < ApplicationController
end
110 và
class BooksController < ApplicationController
end
113

Books are coming soon!
21Bản sao

Để bao gồm

class BooksController < ApplicationController
end
114

Books are coming soon!
22Bản sao

Trình trợ giúp trả về thẻ HTML

class BooksController < ApplicationController
end
117 cho mỗi nguồn được cung cấp

Nếu bạn đang sử dụng Rails với "Asset Pipeline" được bật, trình trợ giúp này sẽ tạo liên kết đến

class BooksController < ApplicationController
end
118. Liên kết này sau đó được xử lý bởi đá quý Sprockets. Tệp biểu định kiểu có thể được lưu trữ ở một trong ba vị trí.
class BooksController < ApplicationController
end
102,
class BooksController < ApplicationController
end
103 hoặc
class BooksController < ApplicationController
end
104

Bạn có thể chỉ định một đường dẫn đầy đủ liên quan đến gốc tài liệu hoặc một URL. Ví dụ: để liên kết đến tệp biểu định kiểu bên trong thư mục có tên là

class BooksController < ApplicationController
end
122 bên trong một trong số
class BooksController < ApplicationController
end
102,
class BooksController < ApplicationController
end
103 hoặc
class BooksController < ApplicationController
end
104, bạn sẽ làm điều này

Books are coming soon!
23Bản sao

Để bao gồm

class BooksController < ApplicationController
end
126 và
class BooksController < ApplicationController
end
127

Books are coming soon!
24Bản sao

Để bao gồm

class BooksController < ApplicationController
end
126 và
class BooksController < ApplicationController
end
129

Books are coming soon!
25Bản sao

Để bao gồm

class BooksController < ApplicationController
end
130

Books are coming soon!
26Bản sao

Theo mặc định,

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
85 tạo liên kết với
class BooksController < ApplicationController
end
132. Bạn có thể ghi đè mặc định này bằng cách chỉ định một tùy chọn thích hợp (
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
92)

Books are coming soon!
27Bản sao

Trình trợ giúp tạo thẻ HTML

class BooksController < ApplicationController
end
136 cho tệp đã chỉ định. Theo mặc định, các tệp được tải từ
class BooksController < ApplicationController
end
137

Lưu ý rằng bạn phải chỉ định phần mở rộng của hình ảnh

Books are coming soon!
28Bản sao

Bạn có thể cung cấp một đường dẫn đến hình ảnh nếu bạn muốn

Books are coming soon!
29Bản sao

Bạn có thể cung cấp hàm băm của các tùy chọn HTML bổ sung

Books are coming soon!
80Bản sao

Bạn có thể cung cấp văn bản thay thế cho hình ảnh sẽ được sử dụng nếu người dùng tắt hình ảnh trong trình duyệt của họ. Nếu bạn không chỉ định rõ ràng văn bản thay thế, nó sẽ mặc định là tên tệp của tệp, được viết hoa và không có phần mở rộng. Ví dụ: hai thẻ hình ảnh này sẽ trả về cùng một mã

Books are coming soon!
81Bản sao

Bạn cũng có thể chỉ định thẻ kích thước đặc biệt, ở định dạng "{width}x{height}"

Books are coming soon!
82Bản sao

Ngoài các thẻ đặc biệt ở trên, bạn có thể cung cấp hàm băm cuối cùng của các tùy chọn HTML tiêu chuẩn, chẳng hạn như

class BooksController < ApplicationController
end
138,
class BooksController < ApplicationController
end
139 hoặc
class BooksController < ApplicationController
end
140

Books are coming soon!
83Bản sao

Trình trợ giúp tạo thẻ HTML5

class BooksController < ApplicationController
end
117 cho tệp đã chỉ định. Theo mặc định, các tệp được tải từ
class BooksController < ApplicationController
end
144

Books are coming soon!
84Bản sao

sản xuất

class BooksController < ApplicationController
end
89Bản sao

Giống như một

class BooksController < ApplicationController
end
134, bạn có thể cung cấp một đường dẫn, tuyệt đối hoặc tương đối với thư mục
class BooksController < ApplicationController
end
144. Ngoài ra, bạn có thể chỉ định tùy chọn
class BooksController < ApplicationController
end
147 giống như tùy chọn
class BooksController < ApplicationController
end
134. Thẻ video cũng có thể có bất kỳ tùy chọn HTML nào được chỉ định ở cuối (
class BooksController < ApplicationController
end
149,
class BooksController < ApplicationController
end
150 et al)

Thẻ video cũng hỗ trợ tất cả các tùy chọn HTML của

class BooksController < ApplicationController
end
117 thông qua hàm băm tùy chọn HTML, bao gồm

  • class BooksController < ApplicationController
    end
    
    152, cung cấp hình ảnh để đặt vào vị trí của video trước khi bắt đầu phát
  • class BooksController < ApplicationController
    end
    
    153, bắt đầu phát video khi tải trang
  • class BooksController < ApplicationController
    end
    
    154, lặp lại video khi đến cuối
  • class BooksController < ApplicationController
    end
    
    155, cung cấp các điều khiển do trình duyệt cung cấp để người dùng tương tác với video
  • class BooksController < ApplicationController
    end
    
    156, video sẽ tải trước tệp cho người dùng khi tải trang

Bạn cũng có thể chỉ định nhiều video để phát bằng cách chuyển một mảng video tới

class BooksController < ApplicationController
end
141

Books are coming soon!
86Bản sao

Điều này sẽ sản xuất

Books are coming soon!
87Bản sao

Trình trợ giúp tạo thẻ HTML5

class BooksController < ApplicationController
end
117 cho tệp đã chỉ định. Theo mặc định, các tệp được tải từ
class BooksController < ApplicationController
end
161

Books are coming soon!
88Bản sao

Bạn có thể cung cấp đường dẫn đến tệp âm thanh nếu muốn

Books are coming soon!
89Bản sao

Bạn cũng có thể cung cấp hàm băm của các tùy chọn bổ sung, chẳng hạn như

class BooksController < ApplicationController
end
139,
class BooksController < ApplicationController
end
138, v.v.

Giống như

class BooksController < ApplicationController
end
141,
class BooksController < ApplicationController
end
158 có các tùy chọn đặc biệt

  • class BooksController < ApplicationController
    end
    
    153, bắt đầu phát âm thanh khi tải trang
  • class BooksController < ApplicationController
    end
    
    155, cung cấp các điều khiển do trình duyệt cung cấp để người dùng tương tác với âm thanh
  • class BooksController < ApplicationController
    end
    
    156, âm thanh sẽ tải trước tệp cho người dùng khi tải trang

Trong ngữ cảnh của một bố cục,

class BooksController < ApplicationController
end
169 xác định một phần mà nội dung từ chế độ xem sẽ được chèn vào. Cách đơn giản nhất để sử dụng điều này là có một
class BooksController < ApplicationController
end
169 duy nhất, trong đó toàn bộ nội dung của chế độ xem hiện đang được hiển thị được chèn vào

Books are coming soon!
00Bản sao

Bạn cũng có thể tạo bố cục với nhiều vùng năng suất

Books are coming soon!
01Bản sao

Phần chính của chế độ xem sẽ luôn hiển thị thành

class BooksController < ApplicationController
end
169 chưa được đặt tên. Để hiển thị nội dung thành một tên
class BooksController < ApplicationController
end
169, bạn sử dụng phương thức
class BooksController < ApplicationController
end
174

Phương pháp này cho phép bạn chèn nội dung vào một khối có tên là

class BooksController < ApplicationController
end
169 trong bố cục của bạn. Ví dụ: chế độ xem này sẽ hoạt động với bố cục mà bạn vừa xem

Books are coming soon!
02Bản sao

Kết quả hiển thị trang này thành bố cục được cung cấp sẽ là HTML này

Books are coming soon!
03Bản sao

Phương pháp

class BooksController < ApplicationController
end
174 rất hữu ích khi bố cục của bạn chứa các vùng riêng biệt như thanh bên và chân trang sẽ chèn các khối nội dung của riêng chúng. Nó cũng hữu ích để chèn các thẻ tải các tệp JavaScript hoặc CSS dành riêng cho trang vào tiêu đề của một bố cục chung khác

Các mẫu một phần - thường được gọi là "partials" - là một công cụ khác để chia quá trình kết xuất thành các phần dễ quản lý hơn. Với một phần, bạn có thể di chuyển mã để hiển thị một phần phản hồi cụ thể vào tệp của chính nó

Để hiển thị một phần dưới dạng một phần của chế độ xem, bạn sử dụng phương thức trong chế độ xem

Điều này sẽ hiển thị một tệp có tên

class BooksController < ApplicationController
end
180 tại thời điểm đó trong chế độ xem đang được hiển thị. Lưu ý ký tự gạch dưới hàng đầu. các phần được đặt tên với dấu gạch dưới ở đầu để phân biệt chúng với các chế độ xem thông thường, mặc dù chúng được tham chiếu mà không có dấu gạch dưới. Điều này đúng ngay cả khi bạn đang lấy một phần từ thư mục khác

Books are coming soon!
04Bản sao

Mã đó sẽ lấy một phần từ

class BooksController < ApplicationController
end
181

Một cách để sử dụng các phần tử là coi chúng tương đương với các chương trình con. như một cách để di chuyển các chi tiết ra khỏi chế độ xem để bạn có thể nắm bắt những gì đang diễn ra dễ dàng hơn. Ví dụ: bạn có thể có một chế độ xem giống như thế này

Books are coming soon!
05Bản sao

Ở đây, các phần

class BooksController < ApplicationController
end
182 và
class BooksController < ApplicationController
end
183 có thể chứa nội dung được chia sẻ bởi nhiều trang trong ứng dụng của bạn. Bạn không cần phải xem chi tiết của những phần này khi bạn đang tập trung vào một trang cụ thể

Như đã thấy trong các phần trước của hướng dẫn này,

class BooksController < ApplicationController
end
169 là một công cụ rất mạnh để dọn dẹp bố cục của bạn. Hãy nhớ rằng đó là Ruby thuần túy, vì vậy bạn có thể sử dụng nó ở hầu hết mọi nơi. Ví dụ: chúng ta có thể sử dụng nó để KHÔ các định nghĩa bố cục biểu mẫu cho một số tài nguyên tương tự

  • class BooksController < ApplicationController
    end
    
    185

    Books are coming soon!
    
    06Bản sao

  • class BooksController < ApplicationController
    end
    
    186

    Books are coming soon!
    
    07Bản sao

  • class BooksController < ApplicationController
    end
    
    187

    Books are coming soon!
    
    08Bản sao

Đối với nội dung được chia sẻ giữa tất cả các trang trong ứng dụng của bạn, bạn có thể sử dụng các phần trực tiếp từ bố cục

Một phần có thể sử dụng tệp bố cục của chính nó, giống như chế độ xem có thể sử dụng bố cục. Ví dụ: bạn có thể gọi một phần như thế này

Books are coming soon!
09Bản sao

Điều này sẽ tìm kiếm một phần có tên là

class BooksController < ApplicationController
end
188 và hiển thị nó bằng cách sử dụng bố cục
class BooksController < ApplicationController
end
189. Lưu ý rằng các bố cục cho các phần tuân theo cách đặt tên có dấu gạch dưới ở đầu giống như các phần thông thường và được đặt trong cùng thư mục với phần mà chúng thuộc về (không phải trong thư mục
class BooksController < ApplicationController
end
190 chính)

Cũng lưu ý rằng cần chỉ định rõ ràng

class BooksController < ApplicationController
end
191 khi chuyển các tùy chọn bổ sung, chẳng hạn như
Books are coming soon!
66

Bạn cũng có thể chuyển các biến cục bộ thành các phần, làm cho chúng trở nên mạnh mẽ và linh hoạt hơn. Ví dụ: bạn có thể sử dụng kỹ thuật này để giảm trùng lặp giữa các trang mới và trang chỉnh sửa, trong khi vẫn giữ một chút nội dung riêng biệt

  • class BooksController < ApplicationController
    end
    
    193

    Books are coming soon!
    
    40Bản sao

  • Books are coming soon!
    
    21

    Books are coming soon!
    
    41Bản sao

  • class BooksController < ApplicationController
    end
    
    195

    Books are coming soon!
    
    42Bản sao

Mặc dù cùng một phần sẽ được hiển thị trong cả hai chế độ xem, trình trợ giúp gửi của Chế độ xem hành động sẽ trả về "Tạo vùng" cho hành động mới và "Cập nhật vùng" cho hành động chỉnh sửa

Để chuyển một biến cục bộ sang một phần chỉ trong các trường hợp cụ thể, hãy sử dụng

class BooksController < ApplicationController
end
196

  • class BooksController < ApplicationController
      def index
        @books = Book.all
      end
    end
    
    80

    Books are coming soon!
    
    43Bản sao

  • class BooksController < ApplicationController
    end
    
    198

    Books are coming soon!
    
    44Bản sao

  • class BooksController < ApplicationController
    end
    
    199

    Books are coming soon!
    
    45Bản sao

Bằng cách này, có thể sử dụng một phần mà không cần khai báo tất cả các biến cục bộ

Mỗi phần cũng có một biến cục bộ có cùng tên với phần (trừ dấu gạch dưới ở đầu). Bạn có thể chuyển một đối tượng vào biến cục bộ này thông qua tùy chọn

class BooksController < ApplicationController
end
800

Books are coming soon!
46Bản sao

Trong phần

class BooksController < ApplicationController
end
801, biến
class BooksController < ApplicationController
end
801 sẽ tham chiếu đến
class BooksController < ApplicationController
end
803 từ chế độ xem gốc

Nếu bạn có một phiên bản mô hình để kết xuất thành một phần, bạn có thể sử dụng cú pháp tốc ký

Giả sử rằng biến thể hiện

class BooksController < ApplicationController
end
804 chứa một thể hiện của mô hình
class BooksController < ApplicationController
end
805, điều này sẽ sử dụng
class BooksController < ApplicationController
end
806 để hiển thị nó và sẽ chuyển biến cục bộ
class BooksController < ApplicationController
end
801 vào một phần sẽ tham chiếu đến biến thể hiện
class BooksController < ApplicationController
end
804 trong chế độ xem gốc

Partials rất hữu ích trong việc kết xuất các bộ sưu tập. Khi bạn chuyển một bộ sưu tập thành một phần thông qua tùy chọn

class BooksController < ApplicationController
end
809, một phần sẽ được chèn một lần cho mỗi thành viên trong bộ sưu tập

  • class BooksController < ApplicationController
      def index
        @books = Book.all
      end
    end
    
    80

    Books are coming soon!
    
    47Bản sao

  • class BooksController < ApplicationController
    end
    
    811

    Books are coming soon!
    
    48Bản sao

Khi một phần được gọi với một bộ sưu tập số nhiều, thì các phiên bản riêng lẻ của một phần có quyền truy cập vào thành viên của bộ sưu tập được hiển thị thông qua một biến được đặt tên theo một phần. Trong trường hợp này, một phần là

class BooksController < ApplicationController
end
812 và trong phần
class BooksController < ApplicationController
end
812, bạn có thể tham khảo
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
13 để biết phiên bản đang được hiển thị

Ngoài ra còn có một tốc ký cho điều này. Giả sử

class BooksController < ApplicationController
end
815 là một tập hợp các trường hợp của
class BooksController < ApplicationController
end
816, bạn chỉ cần viết điều này vào
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
80 để tạo ra kết quả tương tự

Books are coming soon!
49Bản sao

Rails xác định tên của part sẽ sử dụng bằng cách xem tên model trong bộ sưu tập. Trên thực tế, bạn thậm chí có thể tạo một bộ sưu tập không đồng nhất và hiển thị nó theo cách này và Rails sẽ chọn phần thích hợp cho từng thành viên của bộ sưu tập

  • class BooksController < ApplicationController
      def index
        @books = Book.all
      end
    end
    
    80

    Books are coming soon!
    
    70Bản sao

  • class BooksController < ApplicationController
    end
    
    819

    Books are coming soon!
    
    71Bản sao

  • class BooksController < ApplicationController
    end
    
    820

    Books are coming soon!
    
    72Bản sao

Trong trường hợp này, Rails sẽ sử dụng các phần của khách hàng hoặc nhân viên phù hợp với từng thành viên của bộ sưu tập

Trong trường hợp bộ sưu tập trống,

Books are coming soon!
00 sẽ trả về con số không, vì vậy việc cung cấp nội dung thay thế sẽ khá đơn giản

Books are coming soon!
73Bản sao

Để sử dụng tên biến cục bộ tùy chỉnh trong một phần, hãy chỉ định tùy chọn

class BooksController < ApplicationController
end
822 trong lệnh gọi đến một phần

Books are coming soon!
74Bản sao

Với thay đổi này, bạn có thể truy cập một phiên bản của bộ sưu tập

class BooksController < ApplicationController
end
815 dưới dạng biến cục bộ
class BooksController < ApplicationController
end
824 trong phần

Bạn cũng có thể chuyển các biến cục bộ tùy ý cho bất kỳ phần nào bạn đang kết xuất bằng tùy chọn

class BooksController < ApplicationController
end
825

Books are coming soon!
75Bản sao

Trong trường hợp này, partial sẽ có quyền truy cập vào một biến cục bộ

class BooksController < ApplicationController
end
826 với giá trị "Products Page"

Rails cũng cung cấp một biến đếm trong một phần được gọi bởi tập hợp, được đặt tên theo tiêu đề của phần theo sau bởi

class BooksController < ApplicationController
end
827. Ví dụ: khi hiển thị bộ sưu tập
class BooksController < ApplicationController
end
815, một phần của
class BooksController < ApplicationController
end
811 có thể truy cập biến
class BooksController < ApplicationController
end
830, biến này lập chỉ mục số lần nó được hiển thị trong chế độ xem kèm theo. Lưu ý rằng nó cũng áp dụng khi tên một phần được thay đổi bằng cách sử dụng tùy chọn
class BooksController < ApplicationController
end
831. Ví dụ: biến đếm cho đoạn mã trên sẽ là
class BooksController < ApplicationController
end
832

Bạn cũng có thể chỉ định phần thứ hai sẽ được hiển thị giữa các phiên bản của phần chính bằng cách sử dụng tùy chọn

class BooksController < ApplicationController
end
833

Books are coming soon!
76Bản sao

Rails sẽ hiển thị một phần của

class BooksController < ApplicationController
end
834 (không có dữ liệu nào được truyền vào nó) giữa mỗi cặp của
class BooksController < ApplicationController
end
812 một phần

Khi hiển thị các bộ sưu tập, cũng có thể sử dụng tùy chọn

Books are coming soon!
66

Books are coming soon!
77Bản sao

Bố cục sẽ được hiển thị cùng với phần của từng mục trong bộ sưu tập. Các biến object và object_counter hiện tại cũng sẽ có sẵn trong bố cục, giống như cách chúng ở trong một phần

Bạn có thể thấy rằng ứng dụng của mình yêu cầu bố cục hơi khác so với bố cục ứng dụng thông thường để hỗ trợ một bộ điều khiển cụ thể. Thay vì lặp lại và chỉnh sửa bố cục chính, bạn có thể thực hiện việc này bằng cách sử dụng các bố cục lồng nhau (đôi khi được gọi là các mẫu phụ). Đây là một ví dụ

Giả sử bạn có bố cục

class BooksController < ApplicationController
  def index
    @books = Book.all
  end
end
08 sau

  • class BooksController < ApplicationController
      def index
        @books = Book.all
      end
    end
    
    00

    Books are coming soon!
    
    78Bản sao

Trên các trang được tạo bởi

class BooksController < ApplicationController
end
839, bạn muốn ẩn menu trên cùng và thêm menu bên phải

  • class BooksController < ApplicationController
    end
    
    840

    Books are coming soon!
    
    79Bản sao

Đó là nó. Chế độ xem Tin tức sẽ sử dụng bố cục mới, ẩn menu trên cùng và thêm menu bên phải mới bên trong div "nội dung"

Có một số cách để nhận được kết quả tương tự với các sơ đồ tạo khuôn phụ khác nhau bằng kỹ thuật này. Lưu ý rằng không có giới hạn về mức độ lồng nhau. Người ta có thể sử dụng phương pháp

class BooksController < ApplicationController
end
841 thông qua
class BooksController < ApplicationController
end
842 để tạo bố cục mới dựa trên bố cục Tin tức. Nếu bạn chắc chắn rằng bạn sẽ không tạo mẫu phụ cho bố cục
class BooksController < ApplicationController
end
843, bạn có thể thay thế
class BooksController < ApplicationController
end
844 bằng một cách đơn giản là
class BooksController < ApplicationController
end
169

Phản hồi

Bạn được khuyến khích giúp cải thiện chất lượng của hướng dẫn này

Vui lòng đóng góp nếu bạn thấy bất kỳ lỗi chính tả hoặc lỗi thực tế nào. Để bắt đầu, bạn có thể đọc phần của chúng tôi

Bạn cũng có thể tìm thấy nội dung không đầy đủ hoặc nội dung không được cập nhật. Vui lòng thêm bất kỳ tài liệu còn thiếu nào cho chính. Đảm bảo kiểm tra Hướng dẫn cạnh trước để xác minh xem sự cố đã được khắc phục hay chưa trên nhánh chính. Kiểm tra Hướng dẫn Hướng dẫn Ruby on Rails để biết phong cách và quy ước

Nếu vì bất kỳ lý do gì mà bạn phát hiện ra điều gì đó cần khắc phục nhưng không thể tự vá nó, vui lòng mở một vấn đề

Và cuối cùng nhưng không kém phần quan trọng, bất kỳ loại thảo luận nào liên quan đến tài liệu Ruby on Rails đều rất được hoan nghênh trên Diễn đàn Ruby on Rails chính thức