مدیریت محتوا با Sinatra و Mongo – قسمت آخر

در قسمت دوم، یاد گرفتیم که چطور پیج هایی که ساختیم رو نمایش بدیم! در این قسمت، میخوایم مستقیما با دیتابیس وارد مذاکره بشیم! در واقع در این قسمت میخوایم به کاربر اجازه بدیم که خودش یک پیج ایجاد کنه. خیلی هم شیک و ساده. ابتدا این قسمت رو به main.rb اضافه کنید :

get '/pages/new' do
	@page = Page.new
	erb :new
end

در اینجا، گفته شده که یک صفحه به اسم new.erb خونده و نمایش داده بشه. علاوه بر اون، گفتیم که از کلاس Page هم یک شیء جدید برامون بسازه. حالا، فایل new.erb رو به این شکل ایجاد کنید :

<h1> New Page </h1>
 
<form action="/pages" method="post">
	<h2> Title: </h2>
	<input type="text" name="page[title]">
	<h2> Text: </h2>
	<textarea name="page[text]" cols="50" rows="5">
	</textarea>
	<br/>
	<input type="submit">
</form>

در اینجا یک فرم ایجاد کردیم که با متد POST کار میکنه. قبل تر، در مورد متد پست توضیح دادیم، و میتونید این مطلب رو در موردش بخونید تا درکش کنید!

بسیار خوب، الان برای این که برنامه ما درست و حسابی کار کنه، فقط نیاز داریم که با یک متد POST بهش بفهمونیم که اطلاعات رو توی دیتابیس بنویسه. و خب این قسمت رو به main.rb مون اضافه میکنیم :

post '/pages' do
	page = Page.create(params[:page])
	redirect to("/pages/#{page.id}")
end

خب، در اینجا میگیم که پیجی با پارامتر هایی که داده شده بساز، و بعدش برگرد به همون پیج. به همین سادگی!

جمع بندی

در کل این سه قسمت آموزش، یک CMS بسیار ساده ساختیم که یه ادیتور داشت و میتونست نوشته های ما رو توی یک دیتابیس ذخیره کنه و بعد به ما نشون بده. کل فایل main.rb ما به این شکل در اومد :

require 'sinatra'
require 'mongoid'
 
configure do
	Mongoid.load!("./database.yml")
end
 
class Page
	include Mongoid::Document 
	field :title, type: String
	field :text,  type: String
end
 
 
get '/pages' do
	@pages = Page.all
	@title = "Page List"
	erb :index
end
 
get '/pages/new' do
	@page = Page.new
	erb :new
end
 
post '/pages' do
	page = Page.create(params[:page])
	redirect to("/pages/#{page.id}")
end
 
get '/pages/:id' do
	@page = Page.find(params[:id])
	@title = @page.title
	erb :show
end

و کل ساختار فولدرهای ما به این شکل در اومد :

simple-cms/
├── database.yml
├── main.rb
├── README.md
└── views
    ├── index.erb
    ├── new.erb
    └── show.erb

با استفاده از چنین الگویی، شما قادرید که برنامه های واقعی تری بنویسید و از اونها در دنیای واقعی استفاده کنید. در قسمت اول ذکر شد که این CMS بدرد وبلاگ و وبسایت و … نمیخوره. دلیلشم مشخصه! توی این برنامه هیچگونه پرمیشن و سشن و … ای رعایت نشده که بدونیم کدوم یوزر میتونه پیج ایجاد کنه کدوم نمیتونه و این قضایا. یعنی امنیت نداره کانتنتی که روی اون وبسایت تولید میشه. شما میتونید با خوندن داکیومنت در مورد session ها این مورد رو هم هندل کنید و CMS کامل تری بسازید!

موفق باشید :)

مدیریت محتوابا Sinatra و Mongo – قسمت دوم

در قسمت قبل، یاد گرفتیم که چگونه یک سیستم مدیریت محتوای کوچولو رو با پایگاه داده هاش، ایجاد کنیم. در این قسمت، نمایش محتوای پیج در لینک اختصاصی و همچنین نمایش لینک ها در صفحه اصلی رو بررسی میکنیم.

آموزش این قسمت، کوتاه تر از دفعات پیش هستش، دلیلشم اینه که در بخش آخر، باید متد POST رو بررسی کنیم (اگرچه در مقاله ای قبلا این کار رو کردیم، اما میخوایم دوباره آموزش تکرار بشه و یه استفاده عملی از این موضوع داشته باشیم).

بسیار خوب، فایل index.erb که صفحات ما رو نشون میداد باز کنید، به این شکل تغییرش بدید :

<h1> Pages </h1>
<% if @pages.any? %>
<p>
<%  @pages.each do |page| %>
<a href="/pages/<%= page.id %>">
<h1><%= page.title %> </h1>
</a>
<p> <%= page.text %> </p>
<% end %>
</p>
<% else %>
<h1> No pages added! </h1>
<% end %>

دقت کردید؟ ما از id صفحات برای تولید لینک به اون ها استفاده میکنیم!

حالا بیاید کمی فکر کنیم، وقتی روی این لینک ها کلیک کنیم چه اتفاقی میفته؟ طبیعتا یه ارور ۴۰۴ به ما نشون داده میشه و به ما گفته میشه که صفحه یافت نشده. معمولا سیناترا به صورت پیشفرض یک راهنمایی کوچک هم میکنه که چه چیزی باید به فایل main.rb و … اضافه کنیم تا بتونیم نتیجه درستی بگیریم.

حالا برای این که لینک ها ما رو به جای درستی راهنمایی کنند، کافیه که فایل main.rb رو باز کنیم و این خطوط رو بهش اضافه کنیم :

get '/pages/:id' do
	@page = Page.find(params[:id])
	@title = @page.title
	erb :show
end

خب توی این کد، میگیم که پیج ها رو بر اساس id شون پیدا کنه، و تیتر صفحه رو هم تیتر پیج ایجاد شده بذاره. و در نهایت هم میگیم که ظاهر برنامه در show.erb هست. حالا، نیاز داریم که یک show.erb هم بنویسیم :

<h1><%= @page.title %> </h1>
<p>
<%= @page.text %>
</p>
<a href="/pages"> Back to main page </a>

اینجا، عنوان و متن صفحه رو نشون دادیم، به صفحه اصلی هم که لیست مطالبمون داخلش قرار داره هم لینک کردیم. در آموزش بعدی، سعی میکنیم یه ادیتور بسازیم و بتونیم یک صفحه جدید رو از طریق مرورگر، به CMSمون اضافه کنیم!

استفاده از متد POST در سیناترا

فرمورک Sinatra یک میکروفرمورک وب است که اکثر کاربران و توسعه دهندگان روبی، با آن آشنایی دارند. برای شروع و ساخت پروژه هایی که زمان زیادی برایشان نداریم، بدون شک این فرمورک یکی از بهترین انتخاب هاست. در اکثر مثالهایی که در اینترنت موجود است، به گفتن متد get بسنده کرده اند. در حالی متد POST هم متد مهمی در فرمورک های وب به شمار می آید. در این آموزش، استفاده از متد post را بررسی میکنیم.

قدم های اولیه

ابتدا یک پوشه به اسم post-app ایجاد کرده، درون این پوشه پوشه دیگری با نام views ایجاد کنید. سپس در همان پوشه post-app فایل app.rb را نیز ایجاد نمایید. در واقع، این ها قدم های اولیه ما برای نوشتن یک برنامه در سیناتراست. درون پوشه views یک فایل با نام form.erb ایجاد کرده، آن را باز کنید و درونش این محتوا را کپی کنید :

<h3>Simple Form</h3>
<form action="/form" method="post">
  <input type="text" name="content">
  <input type="submit">
</form>

سپس به app.rb رفته، آن را باز کرده و این محتوا را درونش قرار دهید :

require 'sinatra'
 
get '/' do
 erb :form
end

اکنون چنانچه برنامه را اجرا کنید، متوجه خواهید شد که هرچه درون فرم بنویسید، طبیعتا باید به یکجا ارسال شود. اما کجا؟ اینجاست که ما متد POST را نیاز داریم.

اضافه کردن post به کد

همانطور که در کد form.erb مشاهده کردید، ما در قسمت action از آدرس form استفاده نمودیم و همچنین نام محتوای داخل فرم را content گذاشتیم. اکنون فایلی به نام content.erb در views ایجاد کرده، آن را باز کنید و محتوای درونش را به این شکل تغییر دهید :

<h2> You Said </h2> 
<h3> <%= params[:content] %> </h3>

سپس به فایل app.rb برگشته و این خطوط را به آن اضافه نمایید :

post '/form' do
 erb :content
end

و اکنون با اجرای برنامه، هرچه درون فرم طراحی شده بنویسید را در آدرس form مشاهده میکنید. با استفاده از متد post میتوانید اطلاعات را درون یک دیتابیس بنویسید و بیشتر استفاده آن نیز در این موارد است.

موفق باشید.