Các trang tĩnh trong Ruby on Rails


76

Cách chuẩn để tạo một ứng dụng Ruby on Rails sẽ có các trang như

  • Trang Chủ
  • Trong khoảng
  • Tiếp xúc

Tôi sẽ đánh giá cao nếu ai đó có liên kết hoặc câu trả lời hơn là chỉ nói sử dụng một viên đá quý vì tôi muốn học cách tạo các ứng dụng web đơn giản với hành vi như vậy.

Câu trả lời:


113

Phụ thuộc vào cách bạn muốn xử lý nội dung trong các trang đó.

Phương pháp tiếp cận số 1 - lưu trữ nội dung trong các chế độ xem

Nếu bạn chỉ muốn đưa tất cả nội dung của mình vào dạng xem ERB, thì một cách tiếp cận rất đơn giản là tạo một PagesControllertệp có mục đích là xử lý các trang tĩnh. Mỗi trang được thể hiện bằng một hành động trong bộ điều khiển.

pages_controller.rb:

class PagesController < ApplicationController
  def home
  end

  def about
  end

  def contact
  end
end

route.rb:

match '/home' => 'pages#home'
match '/about' => 'pages#about'
match '/contact' => 'pages#contact'

Sau đó, tạo các chế độ xem home.html.erb, about.html.erb và contact.html.erb trong app / views / pages. Các dạng xem này chứa bất kỳ nội dung nào bạn muốn trên các trang tĩnh của mình. Theo mặc định, họ sẽ sử dụng bố cục application.html.erb của ứng dụng của bạn.

Bạn cũng sẽ muốn xem xét bộ nhớ đệm trang để tăng hiệu suất cho mình.


Phương pháp tiếp cận số 2 - lưu trữ nội dung trong cơ sở dữ liệu

Một cách tiếp cận khác mà tôi đã sử dụng là tạo một CMS rất cơ bản cho các trang tĩnh. Trong trường hợp này, các trang được thể hiện trong mô hình. Nó sử dụng đá quý Friendly_id để xử lý các slugs cho mỗi trang để chúng có thể được truy xuất bằng một cái tên đẹp trong URL (ví dụ: / about) thay vì ID.

page.rb:

class Page < ActiveRecord::Base
  attr_accessible :title, :content

  validates_presence_of :title, :content

  has_friendly_id :title, :use_slug => true, :approximate_ascii => true
end

pages_controller.rb:

class PagesController < ApplicationController
  def show
    @page = Page.find(params[:id])
    render 'shared/404', :status => 404 if @page.nil?
  end
end

show.html.erb:

<%= raw @page.content %>

route.rb:

match '/:id' => 'pages#show'

Lưu ý: đặt mục nhập này ở cuối route.rb vì nó khớp với mọi thứ.

Sau đó, bạn muốn tạo, chỉnh sửa và cập nhật trang như thế nào là tùy thuộc vào bạn - bạn có thể có giao diện quản trị hoặc xây dựng nó vào giao diện công khai của bạn bằng cách nào đó. Cách tiếp cận này cũng có thể được hưởng lợi từ bộ nhớ đệm trang.


8
Bạn thậm chí không cần bao gồm các phương thức trống trong bộ điều khiển. CHỈNH SỬA: Ngoài ra, bạn có thể đặt đây là một loại tuyến đường 'bắt tất cả' sau mọi thứ khác: match ': action' => 'trang' để tránh cần cập nhật các tuyến đường khi bạn thêm một trang mới. Tuy nhiên, bạn có thể muốn cẩn thận với điều đó nếu bạn có nhiều tuyến đường phức tạp.
Graham Edgecombe

Cảm ơn bạn rất nhiều Jeff, đó là đúng! Ý tưởng tôi nghĩ đến là cách tiếp cận 2. nhưng tôi không biết làm thế nào để tạo ra những url đẹp như vậy. Một lần nữa cảm ơn bạn!
LuckyLuke

Bạn có thể làm một cái gì đó như domain.com/p/blog-post-slug cho trận đấu và sau đó so khớp với /p/:id. P là 'bài đăng' và thực sự có thể là bất cứ thứ gì. Tôi nghĩ điều này tốt hơn bất kỳ trận đấu nào.
Noah Clark

:approximate_asciigì? Tôi không thể tìm thấy tài liệu về nó. Tuy nhiên, tôi cho rằng nó sử dụng ASCII để ước lượng ký tự UTF-8, ký tự này hiện là mặc định. github.com/FriendlyId/friendly_id/blob/master/lib/friendly_id/…
d_rail

1
@page = Page.find(params[:id])nên được thay đổi @page = Page.find_by_id(params[:id])hoặc bạn sẽ chỉ nhận được mặc định 404 (tại chức) thay vì tùy chỉnh của bạn 404.
d_rail


13

Cách tiếp cận số 1 của Jeff (lưu trữ nội dung trong các khung nhìn và có một tuyến đường và hành động của bộ điều khiển cho mỗi trang tĩnh) là một cách tốt. Điều duy nhất tôi muốn thêm là sử dụng controllermacro trong các tuyến đường của bạn.

Vì vậy, thay vì điều này:

match '/home' => 'pages#home'
match '/about' => 'pages#about'
match '/contact' => 'pages#contact'

Bạn có thể làm được việc này:

controller :pages do
  get :home
  get :about
  get :contact
end

Đó là hai dòng bổ sung, nhưng thanh lịch hơn rất nhiều, vì nó loại bỏ sự lặp lại và nhóm các tuyến trang tĩnh của bạn lại với nhau một cách trực quan.

Nó cũng sử dụng getphương thức động từ http thay vì match, đây là một phương pháp tốt hơn cho các tuyến Rails (và ngắn gọn hơn, giờ đây Rails 4 yêu cầu phải chỉ định động từ http khi sử dụngmatch .


6

Phương pháp tiếp cận số 1 của Jeff rất phù hợp với tôi. Đây là một thủ thuật để làm cho bộ điều khiển tự động tra cứu các trang. Với điều này, bạn không cần phải chạm vào bộ điều khiển cũng như các route.rb để thêm trang. Chỉ cần thả các trang dưới ứng dụng / lượt xem / trang và bộ điều khiển sẽ tìm thấy nó.

class PagesController < ApplicationController
  def show
    render params[:id]
  end
end

Điều này hiệu quả với tôi nhưng chỉ khi tôi có trận đấu hoặc đi đúng tuyến. Có điều gì khác cần được thực hiện để không phải liệt kê tất cả các tuyến đường trong route.rb không? sử dụng đường ray 3.2.12
jrich

Luôn cảnh giác với những gì bạn làm với đầu vào của người dùng. Tôi chưa thử nghiệm điều này, nhưng rendercó quyền truy cập vào mọi chế độ xem, vì vậy tôi sẽ lo lắng về giao diện params[:id]đó admin/whatever. FWIW, Rails sẽ tự động hiển thị một dạng xem mà không cần tạo hành động của bộ điều khiển miễn là dạng xem đó tồn tại trong thư mục dạng xem tương ứng với bộ điều khiển của bạn. Tất cả những gì bạn cần làm là thêm lộ trình thích hợp, đây không phải là vấn đề lớn.
Richard Jones

6

Hãy xem http://railstutorial.org của Michael Hartl có phiên bản 2.3.8 và 3.0.x. Nó bao gồm điều này với các ví dụ tuyệt vời và hướng dẫn bạn xây dựng chúng từ rất sớm và bạn cũng sẽ có cơ hội học hỏi nhiều hơn ví dụ này. Tôi khuyên bạn nên nó.


Điều này hiện có trong phiên bản 3.2 và 4.0.
ngày

2

config / route.rb

get ':id', to: 'pages#show'

app / controllers / pages_controller.rb

class PagesController < ApplicationController
  def show
    begin
      render params[:id]
    rescue ActionView::MissingTemplate
      render :file => "#{Rails.root}/public/404", :layout => false, :status => :not_found
    end
  end
end

Sau đó, đặt các trang tĩnh của bạn trong app / views / pages / {name} .html.erb (hoặc bất kỳ định dạng mẫu nào.)



0

Một câu trả lời đầy đủ cho câu hỏi của bạn về cơ bản sẽ giống như phần giới thiệu về khung công tác Rails: ít nhất là cấu trúc MVC, tạo khuôn mẫu và định tuyến DSL. Jeff đã đưa ra một cú đánh tốt, nhưng câu trả lời của anh ấy vẫn giả định rất nhiều kiến ​​thức cơ bản về Rails từ phía bạn.

Mặc dù vậy, tôi đề nghị rằng nếu ứng dụng web của bạn thực sự đơn giản, Rails có thể quá mức cần thiết. Tôi muốn xem xét một thứ gì đó nhẹ nhàng hơn, như Sinatra , có đường cong học tập thấp hơn nhiều so với Rails và thực hiện rất tốt công việc này mà không cần phải xử lý định tuyến phức tạp, ánh xạ hành động / mẫu MVC ma thuật, v.v.


0

Tôi khuyên bạn nên thêm các trang của mình vào thư mục công cộng để được phục vụ trực tiếp mà không cần phải chuyển qua đường ray nào cả. Mặc dù vậy, tôi không phải là chuyên gia vì vậy tôi không chắc liệu điều này có thể có bất kỳ khuyết điểm nào nếu trang tĩnh hay không.


1
Tuy nhiên, đây có thể được gọi là một giải pháp thô thiển. Điều này sẽ không cho phép chúng tôi sử dụng những gì Rails cung cấp, đặc biệt là Thiết kế bố cục chungBộ nhớ đệm trang . Mặc dù vậy, tôi sẽ không hoàn toàn loại bỏ giải pháp này.
Sagar Ranglani

1
Kỹ thuật này hoạt động nhanh nếu bạn có cấu hình như Apache hoặc Nginx để phân phát các trang trong publicthư mục của mình , nhưng nó loại bỏ bất kỳ loại nội dung động nào trên các trang của bạn, chẳng hạn như thanh điều hướng hiển thị trạng thái đăng nhập / đăng xuất của người dùng.
Richard Jones
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.