0 like 0 dislike
1 view
in ROR by anonymous Bilge (165k points)
rails şiir gibi kod yazmak için :)

2 Answers

0 like 0 dislike
by anonymous Bilge (165k points)

Rails mvc yapısını size sunar. Fakat veri alışverişiniz çoksa sayfalarınız interaktif ise, iki temel tasarıma ihtiyacınız vardır. Çünkü mvc yapısında views üzerinde çok fazla kod bloğunuz olabilir. Mantık views sayfalarına taşınmaya başlamışsa sorun var demektir.
Burada iki temel yapı vardır, kullanılabilecek;

1- Presenter  tasarımı
2- Servis nesnesi tasarımı (Service Object)

Presenter Tasarımı
Views (html, css, erb) sunum (Presenter) içindir. Burada ActiveRecord sorguları olmamalıdır. Views sayfalarının temiz olmasını istiyorsanız içinde mantıksal kod blokları olmamalıdır.
Mesela ternary operatörler ile karar verme blokları bulunabilir. Şimdi bunun nasıl tasarlanacağına bakalım.

Tarihleri belirli bir formatta göstermek şöyle bir modulunuz olabilir;

module DateHelper
  def date_as_month_and_year(date)
    date.strftime("%B %Y")
  end
end

DataHelper module dosyasını app/ klasörü altına presenter klasörü oluşturup içine ekleyebilirsiniz. Burada verinin parametre olarak gönderildiğine dikkat edin.

  • Veri her zaman parametre olarak verilmelidir, instance variable üzerinde işlem yapılmamalıdır.

Replace Complex Conditionals & Formatting Methods With Presenter Object

View içinde aşağıdaki gibi bir ternary operatör olsun;

<p>
  <%= link_to "Read post", post, class: "text-#{post.draft? ? "blue" : "yellow"}" %>
</p>

as

Bu durumda presenters dosyanızda post_presenter.rb modulunuz aşağıdaki gibi olabilir;

class PostPresenter
  def initialize(post)
    @post = post
  end

  def table_css_color
    @post.draft? ? "table-active" : "table-warning"
  end
end

View sayfasının yeni hali ise aşağıdaki gibi olur;

<% presenter = PostPresenter.new(post) %>
<p>
  <%= link_to "Read post", post, class: "text-#{presenter.css_color}" %>
</p>
0 like 0 dislike
by anonymous Bilge (165k points)

2- Service Nesnesi

Controller sınıfları sadece belirli sonuçları söylemelidir. Yani kodu organize eden, kime ne yapacağını söyleyen sınıflar olmalıdır. Sen şunu göster, sen şunu hesapla gibi. Mesela PDF oluşturma işini controller yapmamalıdır. Ya da twitter bağlantısı yaparak bir tweet atabilir.

Bu işlemleri bir servis nesnesi yapabilir. Servis nesnesi bir ruby modülüdür.

Aşağıdaki örnekte app/ klasörü altında services/ klasörü içinde twitter_service.rb modulü oluşturulmuştur.

module TwitterService
  def self.send_welcome_message(twitter_handle)
    client.update("@#{twitter_handle} welcome to 'Oranges & Apples', we hope you enjoy our juicy fruit!")
  end
  def self.client
    @client ||= Twitter::REST::Client.new do |config|
      config.consumer_key        = "..."
      config.consumer_secret     = "..."
      config.access_token        = "..."
      config.access_token_secret = "..."
    end
  end
end
  • Rails her şeyi app / 'dan otomatik olarak yüklediğinden, bu kod controller içinde  kullanılabilir olacaktır.

Controller içinde ise şöyle çağrılabilir;

class UsersController
  def create
    TwitterService.send_welcome_message(user.twitter_handle)
  end
end

Not:RubyGuides.com sitesinden faydalanılmıştır.

En güncel teknolojiler hakkında yeni şeyler öğren, bilmediklerini sor, bildiklerini paylaş...

Categories

...