Chào mừng / trang chủ trong Ruby on Rails - phương pháp hay nhất


80

Trang chủ của tôi (hoặc trang chào mừng) sẽ bao gồm dữ liệu từ hai mô hình (hãy gọi chúng là tác giả và bài đăng). Tôi mới làm quen với đường ray và không biết cách tốt nhất để thực hiện điều này là gì.

Tôi có nên tạo một bộ điều khiển mới có tên là welcome để thu thập dữ liệu từ các tác giả và bài đăng rồi hiển thị chúng trong chế độ xem chỉ mục chào mừng không? Hay tôi nên có chế độ xem chào mừng dưới mô hình bài đăng cũng lấy dữ liệu từ các tác giả? Hoặc bất kỳ cách nào khác để thực hiện điều này?

Tôi hiểu cách thực hiện tất cả những điều này về mặt kỹ thuật nhưng chỉ không chắc đâu là phương pháp thực hành tốt nhất bằng cách sử dụng khung công tác rails.

Câu trả lời:


51

Câu hỏi đặt ra là, trang chủ của bạn chỉ là một trang đích hay sẽ là một nhóm các trang? Nếu đó chỉ là một trang đích, bạn không mong đợi người dùng của mình ở đó lâu ngoại trừ việc chuyển sang nơi khác. Nếu đó là một nhóm trang hoặc tương tự như một nhóm hiện có, bạn có thể thêm một hành động vào bộ điều khiển mà nó giống nhất.

Những gì tôi đã làm cho dự án hiện tại của mình là tạo một bộ điều khiển có tên Static, vì tôi cần 3 trang tĩnh. Trang chủ là một trong những trang này, vì không có gì để xem hoặc làm ngoại trừ đi đến nơi khác.

Để lập bản đồ một tuyến đường mặc định, hãy sử dụng thông tin sau trong routes.rb:

# Place at the end of the routing!
map.root :controller => 'MyController', :action => :index

Trong trường hợp của tôi, điều này sẽ là:

map.root :controller => 'static', :action => :index

Nếu muốn, bạn có thể tạo bộ điều khiển chỉ cho trang chủ này. Tôi gọi nó là chính, hoặc một cái gì đó mà bạn có thể nhớ liên quan đến trang chủ. Từ đó, bạn có thể lấy dữ liệu và các mô hình của mình và chuyển sang chế độ xem đầu ra.

class MainController < ApplicationController
  def index
    @posts = Posts.find(:all, :limit => 10, :order => 'date_posted', :include => :user)
  end
end

Giả sử bạn đã xác định chính xác các mối quan hệ mô hình của mình, thì mẫu để khớp với nó sẽ rất đơn giản.

Chúc may mắn, mong rằng điều này có ích.


Vì vậy, viết @posts = Posts.find( ...hoặc @posts = Posts.allhoặc một cái gì đó tương tự trong bộ điều khiển / hành động mới này sẽ không bị coi là vi phạm các nguyên tắc của DRY, mặc dù mã như vậy có thể đã xuất hiện trong hành động Postcủa bộ điều khiển index? Có cách nào tốt hơn (mô-đun hơn), sử dụng mã đã được viết sẵn Postcho indexhành động của bộ điều khiển không?
LazerSharks

127

Dường như không có một phương pháp nào tốt nhất.

(1) Tệp tiêu chuẩn config/routes.rbdường như gợi ý rằng trang gốc (hoặc trang chủ / trang chào mừng) nên được xử lý welcome#index. Nếu bạn được hướng dẫn bởi điều đó, thì để tạo welcome#indexbộ điều khiển / hành động tương ứng , bạn có thể sử dụng lệnh sau:

rails generate controller Welcome index

Sau đó, config/routes.rbbạn có thể xóa tuyến đường GET ( get "welcome/index") được trình tạo tự động thêm vào và đặt tuyến gốc root 'welcome#index'(hoặc root :to => 'welcome#index'trong Rails < 4) ở đầu tệp, vì nó có thể sẽ là tuyến phổ biến nhất của bạn và nên được khớp trước.

Cũng nhớ xóa public/index.htmltrong Rails < 4.

(2) Các của Ruby on Rails chính thức định tuyến hướng dẫn sử dụng PagesController. Nó thực sự gợi ý pages#main, mặc dù đối với tôi, nó có ý nghĩa hơn khi đi cùng pages#home(vì "trang chủ" là thuật ngữ / khái niệm phổ biến). Thêm vào đó, bộ điều khiển này có thể xử lý khác trang định hướng hành động như pages#about, pages#contact, pages#terms, pages#privacyvv

(3) Các Ruby on Rails Hướng dẫn , đi với static_pages#homestatic_pages#helpvv, mặc dù tôi không thích ý tưởng về biểu thị điều khiển này với "tĩnh". Các trang này vẫn có thể có một số khía cạnh động đối với chúng, đặc biệt là trang chủ!

(4) Mặc dù không thảo luận về cách xử lý trang chủ , RailsCast # 117 trên Trang bán tĩnh đề xuất thêm một bộ phương pháp khác để hiển thị -chỉ tài nguyên.

Tôi cảm thấy ưu tiên cho 1 và / hoặc 2. Với kịch bản "và", bạn có thể sử dụng chỉ mục # chào mừng và các trang # về, v.v., trong khi với kịch bản "hoặc", bạn có thể sử dụng các trang # trang chủ, các trang # về, vv Nếu buộc phải chọn, tôi sẽ chọn tùy chọn 2 chỉ vì bạn kết thúc với ít mã hơn. Và btw, 2 và 3 khá giống nhau, ngoại trừ từ "tĩnh".


12
Câu trả lời hay, tôi sẽ chọn 2) trang # trang chủ.
Neeraj,

3
IMHO, câu trả lời này của @ user664833 phải là câu trả lời được chấp nhận. Diễn đạt logic được nghiên cứu và cân nhắc rõ ràng.
Betjamin Richards

29

Tôi đã tự hỏi mình một điều như thế này khi tôi lần đầu tiên bắt đầu Rails. Đây là những gì bạn cần biết:

  • Mô hình không nhất thiết phải liên quan trực tiếp đến bộ điều khiển và khung nhìn.

Nghĩa là, một tổ hợp bộ điều khiển / chế độ xem cụ thể có thể hoạt động với bao nhiêu mô hình mà bạn cần để tạo trang cụ thể đó.

Mục đích của bộ điều khiển là chuẩn bị tập dữ liệu bạn cần hiển thị, bất kể mô hình nào được sử dụng để lưu trữ dữ liệu đó.

Mục đích của khung nhìn là hiển thị dữ liệu đó theo cách phù hợp nhất.

Nói cách khác, kết hợp bộ điều khiển / chế độ xem không bao giờ nằm ​​dưới một mô hình cụ thể. Họ sử dụng các mô hình, nhưng không nằm dưới chúng trong bất kỳ mối quan hệ phân cấp nào. Trên thực tế, chúng là đồng đẳng với bất kỳ mô hình nào chúng sử dụng.

Tôi nghĩ rằng sự nhầm lẫn đến từ ví dụ về trình tạo giàn giáo được tìm thấy trong AWDR và ​​các văn bản giới thiệu khác, như:

tập lệnh ruby ​​/ tạo bộ điều khiển mô hình giàn giáo

Tôi biết rằng mối quan hệ ngụ ý này giữa mô hình và bộ điều khiển / chế độ xem đã làm tôi bối rối một chút. Nhưng không có mối quan hệ chặt chẽ, thực sự. Nếu có, thì sẽ rất khó để làm bất cứ điều gì phức tạp với cách tiếp cận MVC. Và rõ ràng, đó không phải là trường hợp.

Hi vọng điêu nay co ich.

-- John


10
Câu trả lời của bạn cho câu hỏi là gì?
Mark Wilden

Thay vì cạnh tranh với các câu trả lời khác (có liên quan trực tiếp hơn đến vấn đề trình bày mà người hỏi gặp phải), điều này liên quan đến một quan niệm sai lầm mà John cho rằng người hỏi có. Điều này là hữu ích. Không có lý do gì để John lặp lại những gì người khác đã nói để giải quyết một khía cạnh của câu hỏi mà họ chưa giải quyết.
iconoclast

11

Cách tốt nhất sẽ là gợi ý đầu tiên của bạn. Tạo bộ điều khiển 'chào mừng' và gọi các bản ghi từ bất kỳ mô hình nào bạn muốn. Có một điểm tuyến gốc tới bộ điều khiển đó. Rất sạch sẽ và phù hợp.


9

Xin lưu ý rằng trong Rails3, cách chính xác để xử lý điều này là thêm dòng sau vào cuối tệp route.rb:

root :to => "welcome#index"

và xóa public / index.html.erb.

Cũng xin lưu ý rằng chỉ mục welcome # tương ứng với hành động lập chỉ mục trong WelcomeController và mã từ câu trả lời của The Wicked Flea sẽ giống như sau:

class WelcomeController < ApplicationController
  def index
    @posts = Posts.find(:all, :limit => 10, :order => 'date_posted', :include => :user)
  end
end

1
Nếu nó không phải là bộ điều khiển "chào mừng" hoặc cho một tài nguyên đơn lẻ, hãy sử dụng hành động hiển thị.
dangerousdave

9

Câu trả lời này là của Rails 3.2.1.

Đầu tiên, hãy thiết lập Bộ điều khiển cho các trang, có tên ví dụ static:

$ rails generate controller static

Trong hồ sơ app/controllers/static_controller.rb:

class StaticController < ApplicationController
    def index       
    end
end

Tạo tệp Xem mới app/views/index.html.erb

Và cuối cùng định cấu hình config/routes.rb:

MyApp::Application.routes.draw do
   match 'home', :to => "static#index"
   root :to => "static#index"
end

Điều này sẽ thực hiện cả hai /home/chuyển đến bất cứ thứ gì bạn đặt trong tệp Xem bạn vừa tạo.


Giải pháp rất hay! Tôi đang khó chịu, nhưng tôi khuyên bạn nên đọc dòng thứ haimatch 'home' => 'static#index'
Anconia

6

Tạo một bộ điều khiển mới có tên phù hợp nhất có thể. Bộ điều khiển? StartController? DailyFrontPageController? Bạn sẽ có một ý tưởng.

Không chỉ vậy, tôi nghiêm túc xem xét việc tạo một Mô hình mới, không dựa trên ActiveRecord, thu thập thông tin từ các mô hình Tác giả và Bài đăng của bạn (hoặc bất kể tên thật của chúng là gì) để trình bày trong tầm nhìn của bạn. Giải pháp thay thế là tập hợp dữ liệu trong bộ điều khiển, điều này gần như chắc chắn sẽ rất lộn xộn - đó là lần tôi thử nó và tôi đã thử nó rất nhiều. Một mô hình riêng biệt dường như sẽ gọn gàng hơn rất nhiều.

Nếu quá trình xử lý tương đối đơn giản, tại sao không thử xây dựng dữ liệu trong bộ điều khiển trước, sau đó bọc đầu ra trong một Struct, sau đó thay thế Struct bằng một lớp thực và di chuyển cấu trúc đến đó, cấu trúc lại toàn bộ. Nó không nên thêm quá nhiều vào tổng thời gian (hầu hết mã có thể được sử dụng lại) và bạn sẽ biết rõ về những gì phù hợp nhất với mình.

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.