2009-10-12 45 views
6

Tôi đang phát triển một trang web Rails 2.3.1. Trong toàn bộ trang web, tôi cần phải có một mẫu để tạo Bài đăng trên các trang khác nhau (Trang chủ, Tạo trang Bài đăng, Trang danh sách bài đăng, trang Danh sách nhận xét, v.v. - đủ để nói rằng biểu mẫu này cần phải có trên nhiều trang được phân phối bởi một loạt các bộ điều khiển). Mỗi trang này hiển thị nhiều thông tin khác được truy xuất trong bộ điều khiển/hành động tương ứng. Ví dụ: trang chủ liệt kê 10 bài đăng mới nhất, nội dung được lấy từ DB, v.v.Thực hành tốt nhất cho Rails để có cùng một biểu mẫu trên nhiều trang

Vì vậy, tôi đã chuyển biểu mẫu Bài đăng thành một phần riêng và bao gồm phần này trên tất cả các trang cần thiết. Lưu ý rằng các hình thức trong một phần POST đến/câu hỏi (mà các tuyến đường để PostsController :: tạo - đây là hành vi ray mặc định).

Sự cố tôi đang gặp phải là khi biểu mẫu Bài đăng không được hoàn thành chính xác, theo mặc định là PostsController :: create method render's questions/new.html.erb, ngay cả khi biểu mẫu được gửi từ trang chủ (/ home/index.html.erb).

Tôi đã thử thay đổi biểu mẫu một phần để gửi "submitted_controller" và "submitted_action" và trong PostsController :: create, khi @ post.save? == false, tôi render action => "../submitting_controller/submitting_action" (Đó là hơi hacky, nhưng cho phép bạn render các hành động từ non-PostsController's).

Điều này dường như hoạt động OK trên bề mặt. Biểu mẫu không đầy đủ được hiển thị trong khung nhìn đã gửi nó với tất cả thông báo @ post.errors chính xác, v.v. Vấn đề là TẤT CẢ dữ liệu khác trên các trang không hiển thị, bởi vì các phương thức submit_controller/submitted_action thực tế không được gọi, chỉ chế độ xem được liên kết. (Remeber, tôi đã làm một render mà bảo tồn các đối tượng instance, chứ không phải là một redirect_to mà không bảo vệ đối tượng instance @post có tất cả các thông báo lỗi và các giá trị đã gửi.)

Theo như tôi thấy tôi có hai lựa chọn :

1) Tôi có thể lưu trữ đối tượng @post trong phiên khi @ post.save? không thành công trong PostsController :: create, redirect_to submitted_controller/submit_action, tại thời điểm đó tôi kéo đối tượng @post ra khỏi phiên và sử dụng nó để điền lại các thông báo biểu mẫu/lỗi. (Theo như tôi hiểu, lưu trữ các đối tượng trong phiên là thực hành BAD trong đường ray)

2) Tôi có thể di chuyển tất cả các logic được sử dụng để kéo dữ liệu biểu mẫu tạo không đăng bài từ các submit_controller/submit_action khác nhau, đặt nó vào ApplicationController, tạo ra một tuyên bố chuyển đổi khổng lồ trong PostsController :: tạo cho submit_controller/submitted_action và gọi các phương thức trong ApplicationController để lấy tất cả các dữ liệu bổ sung cần thiết cho mỗi lần render trang của trình đệ trình.

Suy nghĩ về cách tốt nhất để thực hiện việc này trong Rails?

Trả lời

1

Có khả năng là Mô hình bài đăng của bạn trong mối quan hệ thuộc quyền với từng mô hình mà bạn sẽ sử dụng trình điều khiển để hiển thị biểu mẫu của mình không? Bạn có đang thực hiện bất kỳ xử lý đặc biệt nào trong Bộ điều khiển bài viết ngoài Post.create(params[:post]) không?

Nếu bạn trả lời có cho câu hỏi đầu tiên và không cho câu hỏi thứ hai, bạn có thể nhận bằng cách mangling tối thiểu bằng cách thêm accept_nested_attributes_for vào mỗi bộ điều khiển mà người dùng có thể tạo bài đăng.

Bất kể, Robertpostill là chính xác ở chỗ điều này có lẽ là khi bắt đầu xem AJAX, chỉ cần thay thế phần của trang. Vấn đề duy nhất là phải làm gì nếu người dùng đã tắt javascript. Cá nhân tôi thích thiết kế cho trường hợp không phải javascript và thêm các phương thức tiện lợi.

Đối với những suy nghĩ về những gì bạn xem xét hai lựa chọn của bạn,

1) Tôi đã sử dụng phương pháp này để lưu trữ một bản sao cạn của một đối tượng trong băm flash. Bảo quản nó trên các chuyển hướng. Tuy nhiên, điều này có thể không hoạt động cho bạn do tính chất biến của bài đăng. Vì bạn chỉ có thể gửi giá trị dữ liệu 4K và bao gồm các thông tin khác ngoài bản sao nông của bạn.

2) Xem robertpostill của phản ứng

+0

Emfi, Điểm hay về các thuộc tính lồng nhau. Điều đó đã không xảy ra với tôi. Ngoài ra điểm bạn thực hiện về việc mặc định là không phải JS tôi nghĩ là quan trọng. Cảm giác tôi đã nhận được mặc dù là người hỏi (vì thiếu một xử lý tốt hơn :) sẽ kết thúc làm tổn thương hiệu suất ứng dụng thông qua số lượng hành động DB anh/cô ấy sẽ cần phải thực hiện reconstituting tất cả các đối tượng. – robertpostill

+0

Về điều này, chúng tôi đã đồng ý. Tuy nhiên, sự khác biệt giữa non-javascript và AJAX thường là một cuộc gọi link_to_remote, một RJS làm cho một khuôn mẫu, và có thể là một logic điều khiển nhỏ để tránh các cuộc gọi cơ sở dữ liệu mà bạn thường làm theo cách khác. – EmFi

+0

EmFi, Thật không may là mô hình Post và các mô hình của những người điều khiển bạn sẽ sử dụng để hiển thị biểu mẫu có thể không liên quan. (HomeController thậm chí không có mô hình sao lưu). Tôi làm một số kiểm tra trên một cơ chế captcha trong PostController :: tạo (trường captcha không phải là một phần của mô hình bài viết, mà là mô-đun riêng của nó). Tôi nghĩ cả bạn và Robertpostill đều đúng trong AJAX là cách để giải quyết vấn đề này.Tôi chỉ cần tìm ra cách để làm điều đó với jQuery (tôi chọn không sử dụng Prototype, pref cá nhân) và không muck lên bất cứ điều gì trong Rails. – empire29

1

Đây là điểm mà bạn di chuyển từ các bản cập nhật trang đầy đủ để cập nhật các phần của trang thông qua việc sử dụng AJAX. Có một loạt những điều bạn nên xem xét, nhưng cách tiếp cận rails-esque nhất sẽ là phân chia phản ứng giữa một phản ứng AJAX và một phản ứng HTML đơn giản. Hãy xem this ONLamp article, this register article hoặc the awesome agile web development with rails book. Về cơ bản bộ điều khiển của bạn hiển thị một div mới thay thế div cũ chứa kết quả của việc gửi một phần.

Trong câu hỏi của bạn, bạn đề cập đến hai phương pháp và vì vậy tôi sẽ cố gắng và cung cấp cho bạn một số gợi ý về lý do tại sao và tại sao không ở đây:

Lựa chọn 1) Ths lựa chọn không phải là quá xấu với một số điều chỉnh. Tinh chỉnh chính là lưu trữ đối tượng theo dạng được tuần tự hóa trong DB. Sau đó, chỉ cần chuyển xung quanh ID của đối tượng được tuần tự hóa.Upsides của bạn là dữ liệu phiên được duy trì để phục hồi một phiên là neater và phiên của bạn vẫn nhẹ. Nhược điểm của điều này là có một xô cruft phiên trong DB của bạn sẽ gây ô nhiễm ứng dụng của bạn và bạn cần phải suy nghĩ về cách bạn hết hạn sử dụng phiên cruft từ DB. Tôi chưa bao giờ thấy kết thúc này tốt ...

Option2) Eeek không nằm trong application_controller! :) Nghiêm túc, giữ nó như là vũ khí cuối cùng của bạn. Bạn có thể pop những thứ insde người trợ giúp mặc dù và có được quyền truy cập vào những phương pháp bên trong bộ điều khiển và quan điểm của bạn. Tuy nhiên việc kiểm tra các công cụ đó không phải là quá dễ dàng vì vậy hãy cẩn thận trước khi chọn tuyến đường đó. Các câu lệnh switch có thể được thay thế trong các ứng dụng OO với một chút suy nghĩ, chắc chắn trong trường hợp của anh ta, bạn có thể sử dụng các băm tùy chọn để có được một cách railsy có một số thông minh về trạng thái của ứng dụng tại thời điểm yêu cầu được thực hiện.

+0

Cảm ơn, Một vài suy nghĩ: Lựa chọn 1) objs Tracking trong DB có vẻ như nó có thể biến thành một cơn ác mộng, một dốc trơn trượt thực sự. Tùy chọn 2) Tôi không nghĩ rằng Bộ điều khiển có thể truy cập người trợ giúp (phải chịu ảnh hưởng của CakePHP). Hash đồng ý là một ý tưởng tốt, mặc dù tôi vẫn không thích rằng tất cả các lựa chọn dữ liệu cụ thể xem này sẽ được chuyển vào trong những người trợ giúp - dường như nó có thể dễ dàng trở thành một cơn ác mộng bảo trì. Tôi sẽ đọc qua các bài viết bạn đã cung cấp, nhưng tôi nghĩ AJAX sẽ là cách để đi. – empire29

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