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