顯示具有 RoR 標籤的文章。 顯示所有文章
顯示具有 RoR 標籤的文章。 顯示所有文章

未完成的 trackback 功能

本來想實在此功能,但發現 XDite 目前也是需要手動填入 trackback . 所以看到一半放棄,此文紀錄一些查到的資料,跟我實作到一半的步驟.

1. 編寫 send_trackback 的 task ,內容修改自 XDite 範本.

 
# To change this template, choose Tools | Templates
# and open the template in the editor.


require 'rake'
require 'rake/testtask'
require 'rake/rdoctask'

namespace :utils do

# 送出 trackback .
def send_trackback(trackback)
title = "MAPLOG notification" # 主旨.
post_url = "http://maplog.twgg.org/" + trackback.post.id.to_s # 哪篇文章引用.
blog_name = "MAPLOG 地圖碎碎念" # 來源的站名.
content = trackback.post.user.login + " MAPLOG 引用了這篇文章." # 引用內容.
url = trackback.trackback_url
uri = URI.parse(url)
poststring = URI.escape("title=" + title +
"&url=" + post_url +
"&excerpt=" + content +
"&blog_name=" + blog_name)
request = Net::HTTP.new(uri.host, uri.port)
begin
response = request.post(url.gsub(/http:\/\/#{uri.host.to_s}/,''), poststring)
puts response.body
rescue
puts "fail"
end
end

desc "This task will sent trackback"
task :send_trackback => :environment do
puts "sending trackback..."
@trackbacks = Trackback.find(:all, :conditions => "status is NULL")

for trackback in @trackbacks
send_trackback(trackback)
trackback.status = "sent"
trackback.save
end
end

end



2. 檔名存為 rakefile.rake 存至 RailsApp/Libs/taks 下.


3. 在 RailsApp Console 下鍵入 rake -T ,看到最下面出現 utils:send_trackback ,代表新寫的 task 已經加到 task 列表中.


4. 利用 cronjob (定期) 執行 task (執行繁瑣工作).


延伸閱讀:


Google Map on Rails

前言

透過 YM4R 這個 RoR 的 Plug-in ,在 RoR 上使用 GoogleMap API 功能.

此篇主要是實作 YM4R 網頁範例 的實作過程 - 在網頁上顯示 Google Map , Map 上有一個可移動的 GMarker ,底下有一個 Update link ,透過此 link 以 AJAX 的方式更新 Map 上的 GMarker .

程式碼

Controller

show 方法負責初始化一個 Google Map 和 GMarker .

def show
  # placed inside a DIV of id map_div.
  @map = GMap.new("map_div") # 影響 View 中的 DIV id 名稱.

  # add controls.
  @map.control_init(:large_map => true,
    :map_type => true, 
    :overview_map => true)

  # set the center and the zoom.
  @map.center_zoom_init([75.5,-42.56],4)

  # add a marker.
  @marker = GMarker.new([75.6, -42.467],
    :title => "Hello",
    :draggable => true,
    :info_window => "Info! Info!")
  @map.overlay_init(@marker)
end

update 方法連結 JavaScript 上 GMap 變數,並產生準備要更新的 GMarker .

def update
  # bind the Ruby @map variable to the JS variable map,
  # which already exists in the client browser.
  # map is by default the name given to a map created from YM4R/GM
  # (this could be overriden by passing a second argument to
  # the GMap constructor).
  @map = Variable.new("map")

  # create a marker.
  @marker =
    GMarker.new([75.89,-42.767],
    :title => "Update",
    :info_window => "I have been placed through RJS")
end

View

Layout 部份在 Header 區段產生 Google Map 所需要的 JavaScript 的程式碼(ex: GoogleMap Key...) 和 將 "在 Controller 中 show 方法內 @map 變數" 轉換成 JavaScript 程式碼.


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
  <title>Posts: <%= controller.action_name %></title>
  <%= javascript_include_tag :all , :cache => true %>
  <%= stylesheet_link_tag 'scaffold' %>

  <!-- output the header, used by all the maps of the page: It includes the Google Maps API JS code and the JS helper functions of YM4R/GM. -->
  <%= GMap.header %> 

  <!-- initialize the map. -->
  <%= @map.to_html %>

</head>
<body>

<p style="color: green"><%= flash[:notice] %></p>

<%= yield  %>

</body>
</html>


show.html.erb 負責產生 Google Map 在 HTML 放置的區段 和 提供一個更新 Google Map 的連結.

<!- 產生一個放置 Google Map 的 DIV 區段. __>
<%= @map.div(:width => 600, :height => 400) %>

<!-- 產生更新 Google Map 的連結(使用 AJAX 方式).
:update => '取代的div名稱', :url => "呼叫的方法" -->
<%= link_to_remote('Update', {:url => { :action => "update" }}) %>

update.rjs 負責清除 Google Map 上的物件 並 放入一個新的 GMarker(在 Controller 的 update 中產生).

# clear the map of all overlays.
page << @map.clear_overlays

# Then I add the marker.
page << @map.add_overlay(@marker)

畫面

GMonRoR_before

GMonRoR_after

遇到問題

Q 按下 Update 後,畫面上直出 JavaScript 程式碼! 囧rz

A: 一開始以為是 主题:请问有人试过Rails2的ajax开发吗? 主题:link_to_remote 的IE执行问题 ,卡了一天半.

今天一早頭腦清醒! 終於解掉! 原來是 View 裡頭的 link_to_remote 方法我指定了要更新的 Div 區段,就變成在畫面上直出 JavaScript 程式碼. 不指定才會真的將 JavaScript 程式碼寫進 HTML 中.

心得

網路應用程式...真的跟桌面應用程式很不一樣. -.. -

延伸閱讀:

RoR UTF8

MySQL 建立 Table

編寫 db/migrate/ 下 migration 在建立表格時,指定編碼為 UTF-8.
create_table (:plants, :options => 'DEFAULT CHARSET=UTF8') do |t| t.column "name", :string
t.column "planted_at", :datetime
t.column "flower", :boolean end

RoR <-> MySQL

config/database.yml 指定 RoR 與 MySQL 連結時用的編碼.

adapter: mysql
database: flexrss_test
username: root
password:
host: localhost
encoding: utf8

為何我在開發環境下都沒做這些設定還會過! Orz 到底是哪一部份幫我處理掉了! Orz

其他問題

Q 在 Command Line 下執行 rake db:migrate 一直出現遺失 libmySQL.dll 錯誤.

A 在 mysql 資料夾下會看到 libmySQL.dll 這個檔案,拷貝至 ruby/bin 資料夾下就解決了.

參考:

RoR 修改錯誤顯示方式

預設方式真他X醜! 以下為麵包屑讓我之後能查詢.

RoR 中實作圖形驗證

安裝

參考 在ruby on rails中实现验证码. 本人環境為 Windows XP ,執行步驟如下:

  1. http://rubyforge.org/frs/?group_id=12&release_id=20692 下載 RMagick-2.3.0-ImageMagick-6.4.0-2-Q8.zip .
  2. 解壓縮後在命令列下執行:
    gem install rmagick-1.14.1-win32.gem
  3. 直接雙擊安裝 ImageMagick .

架構

詳細程式碼請參考 HowtoSecureFormsWithNoisyImages .

本段先分開解釋 MVC 相關的角色. 下一段才會概述整個流程.

Model

建立 NoisyImage 物件,負責產生 驗證圖片物件,所有圖片 Look&Feel 也封裝在此處.

Controller

可自己寫一個新的 Controller 或 把功能放置合適的 Controller 中,基本上負責三件事.

  • 產生 驗證圖片物件 並丟入 Session 中.
  • 將 圖片檔 利用 send_data 方式傳送至客戶端.
  • 比對 客戶回傳的數字 和 驗證圖片物件所內存的數字.

View

利用以下語法顯示出驗證圖片:
<!-- Controller: CheckController, send_data 所在的方法: code_image -->
<!-- 那在 View 中會看到以下程式碼用來呼叫該方法取得驗證圖片. -->

<img src="/check/code_image">

流程

小括號代表該程式碼所在的位置.

[產生需要驗證的新商業邏輯物件(C)] --> [產生驗證圖片物件(C)] --> [建立證圖片物件(M)] --> [驗證圖片物件丟至 Session 中(C)] --> [網頁呼叫圖片檔(V)] --> [圖片檔利用 send_data 傳送(C)] --> 使用者完成輸入動作 --> [比對使用者輸入的數字(C)] --> 成功 or 失敗

問題

Q1 圖片出不來.

A: 確認 View 裡頭呼叫 Controller 回傳圖片方法 的格式有無寫錯(名稱)!

Q2 圖片出來了,但只有底色沒有看字!

A: 參考 主题:用RMagick做验证码图形,文字显示不出来. 是沒有辦法讀到 Font 的問題.

  • 本人最後把要用到的 Font 放置至 跟 app/public 同等級下的 fonts 目錄下(自行建立).
  • 並在 Model 中加入指定 Font 的程式碼.
    text.font = "fonts/" + ['times.ttf', 'arial.ttf', 'verdana.ttf', 'artro.ttf'].sort{rand}.pop

結語

code_image
為了這短短四個字,搞到我快瘋掉! 我實在是很不會解決實作中會碰到的問題,若我只需要專心處理邏輯部份,其他的功能我都能信手拈來那該有多好! 囧rz

延伸閱讀

RoR 簡單架構筆記

馬上就RoR
最近 RoR 寫到快要腦中風,常常寫到不知道哪個功能要放在哪個地方,要改一個功能也要呆呆想半天才知道去哪裡改.

在這邊自己簡單筆記一下,腦筋不清楚時可以回來看一下,會隨時修改或補充!

Model

  • 簡單就是一個商業物件.
  • 根據 Migrate 定義的表格欄位 產生 相對應的成員變數.
  • 驗證成員變數.
  • 定義物件間的關係(一對一,一對多,多對多).
  • 所有的商業邏輯都要封裝於此.
  • 利用 Callback 功能達成在物件狀態變化前後觸發程式邏輯.
  • (待補充...)

Migrate

  • 定義 Model 在資料庫內的儲存格式.
  • 多對多的關係對照表格.
  • (待補充...)

Controller

  • Model 與 View 之間的橋樑.
  • 決定使用者瀏覽網頁的流程.
  • 所有的 public 方法 (Action) 都需要寫出對應的 View .
  • 利用 Filter 功能(我自己是搭配 Model 內的商業邏輯)達成在 Controller 前後改變行為的效果. ex: 驗證是否登入.
  • (待補充...)

View

  • View Template 對應到 Controller 的 Action .
  • Layout 定義整個網站或 Controller 的 Look and Feel .
  • Patial 是一個小型的展示區塊,方便重新利用.
  • (待補充...)

Helper

  • 關於 View 的小函式. ex: 時間格式.
  • (待補充...)

幫我的 RoR 應用程式化妝 - Yullio

前言

使用 Yullio = Yahoo! UI Library: Grids CSS + Mollio CSS/HTML Templates

  • Yahoo! UI Library: Grids CSS 負責版面配置.
  • Mollio CSS/HTML Templates: 負責背景主題.

安裝

gem install layout_yullio_generator

使用

script/generate layout_yullio controller_name sidebar_name

產生

  • app/views/layout/controller_name.rhtml
  • app/views/controller_name/_sidebar_name.rhtml  為一個 partial 樣板
  • public/ 目錄下的 CSS、JavaScript
  • vendor/plugins/ 目錄下的 Yullio Plug-in

修改

版面配置

在欲修改的 Controller 中設定.

class ExpenseControler < ApplicationController
  ...
  yullio_page_width :doc2 # 決定頁面寬度.
  yullio_column_template :yui_t2 # 決定版面配置.

以下參考 http://developer.yahoo.com/yui/grids/

  • yullio_page_width (參數如下)
    • :doc - 750px centered (good for 800x600)
    • :doc2 - 950px centered (good for 1024x768)
    • :doc3 - 100% fluid (good for everybody)
  • yullio_column_template
    • :yui_t1 - Two columns, narrow on left, 160px
    • :yui_t2 - Two columns, narrow on left, 180px
    • :yui_t3 - Two columns, narrow on left, 300px
    • :yui_t4 - Two columns, narrow on right, 180px
    • :yui_t5 - Two columns, narrow on right, 240px
    • :yui_t6 - Two columns, narrow on right, 300px
    • :yui_t7 - ?

背景主題

以下引述自 [ Jedi's BLOG | Jedi.org ] :

Mollio 這套模版是一整份的 XHTML + CSS 模版,提供了一份樣式指南,有專屬的討論群組,就連用到的圖案素材都釋出了 Photoshop PSD 格式的原始檔。整份模版同時採創意公用授權條款GPLCPL 三種不同的授權方式釋出,任何人想要使用、改作 Mollio 時,都祇需要從三種授權方式中挑選自己願意接受的一種即可。

以下引述自 http://anw.stikipad.com/ocean/show/Mollio+Templates :

Mollio 是個不錯的網頁樣版, 大部份都是靠 CSS 加上一些圖檔完成的, 只用到一個 javascript 做 menu 功能.

所以應該是以修改 原圖 跟 CSS 來達到修改背景主題的效果.

結語

  • 沒有接觸過網路應用程式這一塊,真的是要懂好多,苦!
  • 利用別人已經造好的輪子(畫面配置),再去做修改,以免自己重新發明輪子.
  • 目前就維持 Yullio 的畫面,先回到 M 跟 C 不要再想 V 了! 再這樣下去不知多久才能寫完!

參考資料

很 RoR 的一天

紅班蛙
配合 Ruby 的代表色,所以我今天整天都穿紅班蛙. 外面的天氣是如此地好,卻又捨不得離開電腦.

RoR 1.2 -> RoR 2.0 ,程式碼照著打都會有跑不出來的窘況. 有點剛學寫程式的感覺,不知道有哪些東西可以用,但用出來又有莫名的興奮感!

苦
下午跑去健身房...不!應該說是走去健身房! 石膏拆了三個星期,但一點能跑的跡象也沒有. 單腳撐起身體竟然是如此困難的事.

失去了籃球! 我就真的只是個宅宅了!

老天爺拔了我的腰,又拔了我的右腳. 人生...

一個人在健身房對著自己的身體自言自語. 真是宅爆的一天.

Ruby on Rails-Active record 練習

ActiveRecord 關係

以下內容紀錄 RoR 中,資料物件間的關係.

主要關係

belongs_to

相機 belongs_to 我:
這台相機是我的,同時也可以是其他人的.

build_<association> vs create_<association>

slide.build_photo({:filename => "1.jpg"})
=> #<Photo id: nil, filename: "1.jpg", created_at: nil, updated_at: nil>
slide.create_photo({:filename => "1.jpg"})
=> #<Photo id: 3, filename: "1.jpg", created_at: "2008-03-06 17:16:04", updated_at: "2008-03-06 17:16:04">

build_<associationh> "不"會在 DB 上產生資料, create_<association> 會在 DB 上產生資料.

has_many

has_many 是 belongs_to 關係的另一端(一對多關係).
我 has_many ----- belongs_to 相機.

has_one

has_one 是 belongs_to 關係的另一端(一對一關係).
資料表中有外鍵的類別使用 belongs_to.
ex: 相機的資料表中,有指到人的外鍵( people_id)
-> 那就要在 camera 中寫上 belongs_to :people

has_and_belongs_to_many

多對多關係. 不再倚賴單一的外鍵欄位,而是利用額外的關係資料表來紀錄多對多關係.

輔助關係

rails 2.0 的 acts_as_xxx 都被轉移到官方 Plug-in 中. 利用下列指令安裝:

./script/plugin install act_as_xxx


練習時遇到問題:

Q: NetBeans 自動補齊程式碼.

A: Ctrl + \ (更多請參考 http://wiki.netbeans.org/RubyShortcuts )
一下 Eclipse 一下 NetBeans ,幹我真的會錯亂! Orz

Q: 使用 belongs_to 時,遇到命名規則問題.

A:
belongs_to 後面的 symbol 使用單數名詞 ( ex: :slide_show ).
has_many 後面的 symbol 使用複數名詞 (ex: :slide_shows ).

Q: 使用 form_for 時,會發生  undefined method 'XXX_path' for #<ActionView::Base>.

A:
form_for 會去找尋 XXX_path 這個方法. 我一開始利用 scaffold 自己產生 XXX model 相關的程式碼時.它會自動去 Configurtion/routes.rb 加入 XXXs_controller 的對映.
# Sample resource route (maps HTTP verbs to controller actions automatically):
map.resources :photos     # scaffold 自己會填入.
map.resources :slideshows # 沒有透過 scaffold 就要自己寫入.
map.resources :categories # 沒有透過 scaffold 就要自己寫入.

Q: 不同 View 想使用共用的片段介面.

A:
使用 Partial 的方式. 參考 http://www.uuzone.com/club/21274/forum/284387.htm
建立 _form.html.erb在要使用該片段的介面裡面加上
<%= render :partial => 'form' %>

Q: paginate 失效!

A: 參考 http://www.javaworld.com.tw/jute/post/view?bid=59&id=213750&sty=1&tpg=1&age=0 ,內有所有 RoR 取消的方法. paginate 被 will_paginate 取代.

官方 will_paginate 安裝方式: http://rock.errtheblog.com/will_paginate 

下載位置(有可能失效):
will_paginate (svn://errtheblog.com/svn/plugins/will_paginate)
classic_pagination (svn://errtheblog.com/svn/plugins/classic_pagination)

安裝日期為 2008/3/12,不保證之後 will_paginate 作者不會改變作法. 以下為經過無數次失敗的血淚紀錄,一度讓我不想再學習 RoR :

  • X 透過 gems 安裝,然後在 Configuration/environment.rb 內加入 require 'will_paginate'
  • X 將 gems 捉回來的 will_paginate 放到 <你的應用程式>/vendor/plugins 下.
  • X 透過 svn 下載的方式( NetBeans 安裝 New Plugin + 安裝 svn )已經失效,什麼鬼都沒有下載回來.
  • O 直接下載 http://github.com/mislav/will_paginate/tarball/master ,解壓縮後改名為 will_paginate (非必要) 放至 <你的應用程式>/vendor/plugins 下,終於成功!

Q: 利用 DB 來存放 Session 資料後,發生 No :secret given to the #protect_from_forgery call.  Set that or use a session store capable of generating its own keys (Cookie Session Store).

A: 至 ApplicationController 將 protect_from_forgery 後面的註解取消掉.

延伸閱讀:
JavaEye3.0開發手記之一 - 我的開發環境
Rolling with Rails 2.0 - Part
Rails 2.0 搶鮮版釋出!
RESTful Rails - 簡單心得
RESTful Rails 2.0 , part 1: scaffolding
Upgrade to Rails 2.0.2
My Rails Way
主题:在Rails2.0当中被废弃的用法提示

Ruby on Rails-快速建立一個 MVC 範例

rails 
開發環境:
Rails 2.0.2
NetBeans 6.0
MySQL 5.0(透過 Instan Rails 啟動)/sqlite 3.0(Rails 2.0.2預設資料庫)

以下為偏重於實作的步驟紀錄:

建立一個 Post 的 CRUD 系統, Post(內含兩個欄位-名稱 和 備註) 為 Model , 利用 scaffold 產生的網頁為 View , 負責協調 Post 和 網頁的工作則落在 Controller 身上. 因為直接利用 scaffold 建立,所以整個步驟會短到不可思議!

利用 scaffold 建立 MVC. 在命令列下執行:
ruby script/generate scaffold post name:string memo:string
即會產生所需的 MVC 外加 Migration .

利用 Migration 建立資料庫. 在命令列下執行
rake db:migrate
即在資料庫內建立存放 Post 的表格 .

開啟 Web Server. 利用瀏覽器打開 http://localhost:3000/posts 就可以看到由 scaffold 產生系統畫面.


以下是實作時遇到的問題.

Q: 無法直接使用 scaffold .

Rails 1.2 原本可直接使用以下語法:

class PostsController < ApplicationController
  scaffold :post
end

但現在則會顯示錯誤訊息:
NoMethodError in AdminController#index
undefined method `scaffold' for AdminController:Class

A: 解答在 http://davidlynch.org/blog/2008/01/rails-20-scaffolding/
作者認為對使用者來說,利用 "產生一堆可見程式碼(使用者可以看到並客製化)" 比 "原本的神奇語法" 對後續的工作來得有幫助!

Q: 在 NetBeans 下執行 Migration 出現

rake aborted!

undefined method `require_gem' for main:Object

A: 解答在 http://blog.nanorails.com/articles/2007/12/20/ruby-gem-1-0-is-out
利用 NetBeans 直接產生的專案,其 Configuration/boot.rb 的內容跟用 Rails 產生的內容有所差異,將 Configuration/boot.rb 內的 "require_gem" 以 "gem" 取代,或都使用 Rails 來產生 RoR 專案.

延伸閱讀:
Rails 2.0 搶鮮版釋出!

Ruby on Rails-安裝環境

之前 RoR 還在 1.2 時寫過一個小程式-通訊錄,基本的 CRUD 的寫好了,但後來工作一忙就又不了了之了. 經過了一年多, Ruby 的語法又都還給課本了,上網看了一下 RoR 竟然已經升至 2.0 ,我買的 Ruby on Rails 建置與執行 就這樣又進棺材了. Orz

現在又重頭慢慢來一次,就邊寫邊筆記吧! 至少把通訊錄做出來用一下好了! 時程-未知.

rails
官方網站: http://www.rubyonrails.org/
以下步驟皆從官網一步一步執行.

直接從 http://instantrails.rubyforge.org/wiki/wiki.pl 下載 Windows 版本的懶人包包裝好的 RoR - Instant Rails (包含網頁伺服器,資料庫,Ruby,Rails 等等).

根據 http://instantrails.rubyforge.org/wiki/wiki.pl?Getting_Started 開始安裝懶人包執行 RoR ,照著網頁上修改設定,便可在電腦上啟動 Web Server(Apache or Mongrel ?) + RoR + DataBase(MySQL),執行內附的兩個範例應用-mycookbook,Typo.

按照 http://www.aptana.com/rails/ 所示,先到 http://www.aptana.com/studio/download 安裝 Aptana 套件(Eclipse Plug-in),再安裝此套件底下的 RadRails . RadRails 用來編寫 RoR 應用程式.

RadRails 安裝成功後,至 Preferences > Ruby > Installed Interpreters 設定 RubyVM 至 Instant Rails 下的 ruby 目錄,若未設定預設為使用 JRuby . 至 Preference > Rails > Configuration 設定 Rail 的相關檔案路徑指向 Instant Rails 下的對應的檔案.

建立 Rail 專案,開啟該專案的網路服務,利用瀏覽器畫面開啟 http://127.0.0.1:3000 ,若看到 RoR 歡迎畫面代表整個環境架設成功!

延伸閱讀:
Mongrel 使用方式
Mongrel 使用方式 Part 2 : Mongrel Cluster
Eclipse / Radrails 安裝
我想寫 Ruby on Rails (Windows 篇)
Ruby on Rails(Windows),從安裝到 Helloworld
用 Netbeans 開發 Ruby on Rails 程式