Önceki bölümü okumadan buraya geldiyseniz hiç kasmayın geri dönün
- ORTA SEVİYE BİR RAİLS TUTORIAL - 1 (Kurulum, ilk stiller)
- ORTA SEVİYE BİR RAİLS TUTORIAL - 2 (Kullanıcı girişi - Bootstrap CSS)
Ana Sayfa Listesi
Ana sayfada gönderiler listesi yayınlamak istiyoruz. Bu listede tüm gönderileri kart formatında göstereceğiz.
İşe gönderileri kaydedecek
Post modelini tanımlayarak başlıyoruz. Konsolda
rails g model post
Ayrıca yazıları kategorize etmek için
Category modeline ihtiyacımız var
rails g model category
User , Category ve Post modelleri arasındaki ilişkileri tanımlayalım.
app/models/post.rb
class Post < ApplicationRecord belongs_to :user belongs_to :category end
app/models/user.rb
... has_many :posts, dependent: :destroy end
app/models/categoy.rb
class Category < ApplicationRecord has_many :posts end
User modeli içindeki dependent: :destroy kullanıcı kaydı silindiğinde ona ait tüm gönderilerin de silineceğini emreder.
db/migrate/yyyymmddhhMMss_create_posts.rb
class CreatePosts < ActiveRecord::Migration[5.1] def change create_table :posts do |t| t.string :title t.text :content t.belongs_to :category, index: true t.belongs_to :user, index: true t.timestamps end end end
db/migrate/yyyymmddhhMMss_create_categories.rb
class CreateCategories < ActiveRecord::Migration[5.1] def change create_table :categories do |t| t.string :name t.string :branch t.timestamps end end end
Migrasyonları çalıştıralım.
rails db:migrate
Yerleşim
Henüz ana sayfamız bomboş. Şimdi onun yerleşimini Bootstrap ile düzenlemeye geldi.
views/pages/index.html.erb dosyasını açalım ve içine yerleşimi düzenlemek için şunları yazalım:
app/views/pages/index.html.erb
<div class="container"> <div class="row"> <div id="side-menu" class="col-sm-3"></div><!-- sol kenar menü --> <div id="main-content" class="col-sm-9"></div><!-- ana içerik --> </div><!-- row --> </div><!-- container -->
Şimdi biraz CSS ile sayfa stilini değiştirelim.
assets/stylesheets/partials klasöründe home_page.scss adında bir dosya ekleyelim.
app/assets/stylesheets/partials/home_page.scss
#main-content { background: white; min-height: 800px; margin: 0; padding: 10px 0 0 0; } #side-menu { padding: 0; #links-list { margin-top: 20px; padding: 0; font-size: 14px; font-size: 1.4rem; a { display: block; padding: 5px 15px; margin: 2px 0; } li { min-width: 195px; max-width: 195px; } li, li a { color: black; text-decoration: none; } li:hover { border-radius: 50px; background: $navbarColor; } li:hover a, li:hover i { color: white; } } }
mobile.sccs içinde max-width: 767px bloğu içine şunu ekleyelim:
app/assets/stylesheets/responsive/mobile.scss
#side-menu { display: none !important; }
Şimdi sayfamız büyük ekranda böyle görünecek:
Küçük ekranda da böyle görünecek:
Seed’ler
Gönderileri ana sayfada gösterebilmek için önce veritabanına eklememiz gerekiyor. Verileri manual olarak hem sıkıcı hem de çık vakit alacaktır. Bu işi otomatik olarak yapmak için seed kullanırız. seeds.rb dosyasını açalım ve aşağıdaki kodu ekleyelim:
db/seeds.rb
def seed_users user_id = 0 10.times do User.create( name: "test#{user_id}", email: "test#{user_id}@test.com", password: "123456", password_confirmation: "123456" ) user_id += 1 end end def seed_categories hobby = ["Sanat", "Elişi", "Spor", "Bilim", "Kolleksiyon", "Okuma", "Diğer"] study = ["Sanat ve İnsanlık", "Fizik bilimi ve Mühendisliği", "Matematik ve Mantık", "Bilgisayar Bilimleri", "Veri Bilimleri", "Ekonomi ve Finans", "İş Hayatı", "Sosyal Bilimler", "Dil", "Diğer"] team = ["Çalışma", "Geliştirme", "Sanat ve Hobi", "Diğer"] hobby.each do |name| Category.create( branch: "hobby", name: name ) end study.each do |name| Category.create( branch: "study", name: name ) end team.each do |name| Category.create( branch: "team", name: name ) end end def seed_posts categories = Category.all categories.each do |category| 5.times do Post.create( title: Faker::Lorem.sentences[0], content: Faker::Lorem.sentences[0], user_id: rand( 1..9 ), category_id: category.id ) end end end seed_users seed_categories seed_posts
Görüleceği üzere
User , Category ve Post tablolarına sahte kayıtlar eklemek üzere 3 adet metod tanımlıyor ve kullanıyoruz. Faker gem ise dummy yazı üretmek için kullanılır. Bunu Gemfile içine eklemeliyiz.
gem "faker"
ve tabi konsoldabundle
Bu verileri veritabanına yüklemek için konsolda
seed komutu çalıştırmalıyız. Konsolda:
rails db:seed
Gönderilerin yayınlanması
posts klasörüne ihtiyacımız var. Posts adında bir kontrolör ürettiğmizde görsel kalıpları için posts klasörünü otomatik olarak üretecektir. Konsolda
rails g controller posts
Bizim uygulamamızın PagesController kontrolörü ana sayfamızdan sorumlu olduğundan pages_controller.rb dosyasındaki index aksiyonu içinde veri sorgulamamızı yapacağız. index aksiyonu posts tablosundan bazı kayıtları getirecek. Alınan kayıtlar bir oluşum değişkenine kaydedilecek, böylece bu kayıtlara görsel kalıp dosyalarından erişilebilecek.
index aksiyonuna şunları yazalım:
app/controllers/pages_controller.rb
def index @posts = Post.limit( 5 ) end
Ana sayfanın görsel kalıbına gidelim ve
.main-content elemanı içine şunu ekleyelim:
<%= render @posts %>
Bu bize
index aksiyonunda seçilmiş olan tüm gönderileri yayınlar. Ama render metodu post nesneleri Post sınıfına ait olduğu için
views/posts/_post.html.erb
parça görsel dosyasını arayacaktır. Bu görsel henüz yok, dosyayı üretelim ve içine şunları yazalım:
app/views/posts/_post.html.erb
<div class="col-sm-3 single-post-card" id=<%= post_path(post.id) %>> <div class="card"> <div class="card-block"> <h4 class="post-text"> <%= truncate( post.title, :length => 60 ) %> </h4> <div class="post-content"> <div class="posted-by"> Gönderen <%= post.user.name %> </div> <h3><%= post.title %></h3> <p><%= post.content %></p> <%= link_to "İlgileniyorum", post_path( post.id ), class: "interested" %> </div> </div> </div><!-- card --> </div><!-- col-sm-3 -->
İstenen stili sağlamak için bootstrap card elemanı kullanıyoruz. Gönderinin içeriğini ve linkini bu elemana koyacağız. Ayrıca içeriğe de tüm gönderinin linkini koyduk.
Ancak gönderiler için daha route dosyamızda bilgileri girmedik, Rails nereye yönleneceğini bilemez.
routes.rb dosyasına aşağıdaki yolları da ekleyelim:
resources :posts do collection do get "hobby" get "study" get "team" end end
resources metodu tüm
index , show , new , edit , create , update ve destroy aksiyonları için yolları otomatik olarak deklare eder. Bunlardan ayrı olarak birçok Post oluşumuna erişebilen uygulamamıza özel yolları da collection ile tanımladık. Bunlarla ilgili sayfaları ileride oluşturacağız.
Gönderilerin stilleri ile oynamak için
partials klasörü altında yeni bir scss doyası üretelim:
app/assets/stylesheets/partials/posts.scss
.single-post-card { min-height: 135px; max-height: 135px; box-shadow: 1px 1px 4px rgba(0,0,0, 0.3); color: black; padding: 10px; text-align: left; transition: border 0.1s, background 0.5s; .post-text { overflow: hidden; } a, a:active, a:hover { color: black; } &:hover { cursor: pointer; background: white; box-shadow: none; border-radius: 1%; } } .post-content { display: none; }
Artık ana sayfa şuna benziyor:
Bişeyler ortaya çıkmaya başladı. Önümüzdeki bölümde JavaScript kullanımını da göreceğiz. Şimdilik kalın sağlıcakla ..
Sırada şunlar var:
- ORTA SEVİYE BİR RAİLS TUTORIAL - 4 (JavaScript stiller)
- ORTA SEVİYE BİR RAİLS TUTORIAL - 5 (Kolleksiyon sayfaları)
- ORTA SEVİYE BİR RAİLS TUTORIAL - 6 (Ana sayfa güncellemesi)
- ORTA SEVİYE BİR RAİLS TUTORIAL - 7 (Anlık mesajlaşma ilavesi)





Hiç yorum yok:
Yorum Gönder