Rails 102 網站建制過程學習筆記

Xdite 寫了一個專為 Rails 新手練習用的網站 Spec,目的是為了讓 Rails 新手透過開發一個實際專案,從中汲取許多知識、能力。

我大約花了四、五天把大部份的功能寫出來,剩下「作者和討論者可以在有人留言時,就收到留言更新」和「每週自動整理點擊數高的連結寄給訂閱者」這兩個功能還沒做。之後隔了兩個禮拜多,才花了一點時間把「作者和討論者可以在有人留言時,就收到留言更新」這個功能解決掉,但最後一個功能就沒有繼續開發了,雖然寫得出來,但因為沒什麼動力就決定到這裡就好。

學習 Rails 大約四個月多,花了一個多月把 Rails Tutorial 這本書讀完,之後開發了兩個非常小的網站(比 Xdite 寫的這個 Spec 還少)。

後來收到 Rails 101 這本書的更新通知,就把整本書 Run 過一遍,基本上書中的內容大致都會了,但從 Xdite 的 Code 中還是學到了一些東西。

整本書 Run 完後又看到 Xdite 寫的這個 Spec,於是就著手練習了一下,雖然最後沒有全部完成,但過程還是學到了不少東西。我把學到的東西都記錄在這篇文章中。

使用者可以填入網址,網站自動抓標題和簡介

Xdite 解法:不在前端抓,在後端抓。

在後端抓的好處:假設 user 那邊還沒把內容抓完就按送出也不會有問題。

為防 code 連結消失,也把 code 貼在這裡:

class Link < ActiveRecord::Base
  scope :recent, order("id DESC")
 
  belongs_to :post
  belongs_to :user
  belongs_to :group
 
 
 
  after_create :update_info
 
 
  def update_info
    delay.update_from_embedly
  end
 
 
  def update_from_embedly
 
    link = self
 
    urls = [url]
    embedly_api = Embedly::API.new(:key => Setting.embedly_key)
    embedly_objs = embedly_api.oembed(:urls => urls)
    embedly_obj = embedly_objs[0]
 
    response_data = embedly_obj.marshal_dump
 
    link.title             =  response_data[:title]
    link.link_type         =  response_data[:type]
    link.author_name       =  response_data[:author_name]
    link.author_url        =  response_data[:author_url]
    link.provider_name     =  response_data[:provider_name]
    link.provider_url      =  response_data[:provider_url]
    link.description       =  response_data[:description]
    link.thumbnail_url     =  response_data[:thumbnail_url]
    link.thumbnail_width   =  response_data[:thumbnail_width]
    link.thumbnail_height  =  response_data[:thumbnail_height]
    link.html              =  response_data[:html]
    link.width             =  response_data[:width]
    link.height            =  response_data[:height]
 
    link.save
  end
 
 
end

上面的 code 需要這個 Gem : embedly-ruby

這是說明文件:Embedly::API

作者和討論者可以在有人留言時,就收到留言更新

目前解法:有人留言時就把這個 link 下面的所有留言者抓出來,寄 mail 給他們。使用Mailgun。 code:

def send_emails
	link = @comment.commentable
	comments = link.comments
	emails = comments.map! { |comment| comment.user.email }
	emails &= emails
	ReplyMailer.new_reply(emails).deliver
end

我翻文件發現一個好玩的東西:兩個不同的陣列使用 & 這個 operator 時,會把兩個陣列都有的內容保存下來,假設一個元素有多個也只會保留一個。

舉例:

[1,1,2,3] & [1,2,4,5]
=>  [1, 2]

因此我的解法是,先把所有在這個link下面每一則留言的使用者的 email 都放在一個陣列中(上面的 email),之後再用 & operator,兩個一樣的 email 陣列做運算之後的結果存回 email 陣列中。這樣就可以把重複的 email 去掉。

官方文件的說明在這裡:http://www.ruby-doc.org/core-2.1.0/Array.html#method-i-26

##計算一個外部網址被點擊次數 思路:經由 controller 轉向到那個網址去。

假設原本網址是: http://google.com

那麼就透過這樣的網址轉出去: http://yourhost.com/redirect/1

comments powered by Disqus
分享至 Facebook 分享至 Google +