Powered By Blogger
Showing posts with label ruby_on_rails. Show all posts
Showing posts with label ruby_on_rails. Show all posts

04 July 2007

ruby ,trim , strip , sketchup script , rails กับภาษาไทย

วันนี้ มาพูดถึง Ruby On Rails ( RoR ) กันต่อ
จดไว้กันลืม ด้วยครับ

ruby ไม่มีคำสั่ง trim แต่มี คำสั่ง ที่เหมือนกัน คือ strip
เช่น
" foo ".strip # returns "foo"
[first_name, last_name].each { s s.strip! } # ทำทั้ง array
หรือใช้ strip! เพื่อปรับปรุงทันที
เช่น
mydata = " test this is a book "
mydata.strip!
puts mydata # จะได้ "test this is a book"



ibrary สามารถ ใช้ได้ กับ Rails ได้ โดยแยกเป็น แฟ้มๆ
แล้วแทรกไว้ ใน controller หรือ view ได้ เช่น
ใน *.rhtml แทรกโค้ด ต่อไ ปนี้ไว้ เพื่อ add library


โดย ใน lib1.rb มีคลาสอยู่ จะทำให้เรียกใช้งานได้
lib1.rb เก็บไว้ใน path ที่หาได้ โดย Dir.pwd ( หา Current Directory )
แต่ปัญหา ของ rail ก็มีอยู่ที่ *.rb ไม่ support thai ( เท่าที่ผมลองดู ใช้แล้วแจ้ง error , utf ก็error ) เลย
งาน ที่ต้องใช้แสดงผลภาษาไทย เลยไม่เหมาะจะอยู่ใน library นี้
ยังรอดอยู่บ้างตรงที่ *.rhtml support ไทย ดังนั้น code ต่างๆของฟังก์ชัน
ที่ใช้ภาษาไทย เช่น วันที่ อาจเก็บไว้ที่ *.rhtml ของวิว แทน

ตัวอย่างโค้ดเก็บวันที่ เช่น



<%     def monthname_th(m)       nm =  ['มค.','กพ.','มีค.','เมษ','พค.','มิย.' , 'กค.' , 'สค.','กย.' ,'ตค.', 'พย' , 'ธค' ]       nm[m-1]   end %>

เป็นโค้ดแสดงเดือนไทยจาก วันที่ เมื่อ m เป็นตัวแปรชนิด date

และก็เพิ่งรู้ว่า sketchup (free)

สามารถ รัน Ruby Script ได้

ลองดูแล้วก็ทำได้จริงๆ ใช้ Generate line แบบง่ายๆได้ แสดง Html Form ได้

แสดง webpage window ได้ และอื่นๆ อีกมาก

ลอง ทดสอบ generate line ของสมาการ พาราโบลา 2 มิติง่ายๆ ดู พอได้แต่ไม่ชำนาญ

ทำโดย สร้าง file *.rb สมมุดิ ชื่อ Info.rb

สร้าง class ภายใน และเรียกใช้ class ดังนี้











class Info
def getCurDir
Dir.pwd
end
def msgbox(s )
UI.messagebox( s )
end
def draw_line_test()
model = Sketchup.active_model
pt1 = [0, 0, 0]
pt2 = [10, 10, 10]
model.entities.add_line(pt1, pt2)
pt2 = [0, 10, 10]
model.entities.add_line(pt1, pt2)
pt2 = [10, 0, 10]
model.entities.add_line(pt1, pt2)
end
def draw_line_test2()
model = Sketchup.active_model
z0 = 0
zn = 0
(-20).step(20,0.5){ x
z1= y = x * x / 10
z2 = y = (x+1) * (x+1) / 10
if x == -20
z0 = z1
elsif x == 20
zn = z2
end
pt1 = [x, 0 , z1]
pt2 = [x+1, 0 , z2]
model.entities.add_line(pt1, pt2)
}
end
end # class

#### start create class and call function
i = Info.new
i.draw_line_test
i.draw_line_test2
i.drawtext_test
i = nil






เซฟไว้ที่ c:\Info.rb
แล้ว เรียกใช้ ผ่าน RubyConsole ของ Sketchup
โดย ใช้คำสั่ง load
load 'c:\Info.rb'

ข้อควรระวัง คือ ต้องเป็น โคด แบบเดี่ยว ' ไม่ใช่ แบบ " ไม่เช่นนั้น อาจต้องใช้ string

แบบ "c:\\Info.rb" แทน แต่ยังไม่ได้ทดลอง

หลังจาก กดEnter ให้รัน จะได้ รูป ทรงแบบง่ายๆ ใน sketchup pro



เขียนไว้กันตัวเอง ลืมด้วยครับ
ช่วงนี้ ศึกษาหลายภาษา




05 June 2007

Ruby On Rails กับ MySQL , Thai Character display

การแสดงผล ภาษาไทย
รับข้อมูล ภาษาไทย จาก form
ใส่ใน mysql อาจทำให้ ตัวหนังสือที่แสดงออกภายหลัง กลายเป็น ???????? แทน

แก้ไขได้ ดังนี้ คือ

เพิ่ม โค้ด

---------------------------------------------
before_filter :configure_charsets

def configure_charsets
@headers["Content-Type"] = "text/html; charset=TIS620"

suppress(ActiveRecord::StatementInvalid) do
ActiveRecord::Base.connection.execute 'SET NAMES TIS620'

end
end
----------------------------------------------

ไว้ที่ส่วนต้น ของ ทุกๆ Controlers แล้วก็ ลองป้อนและแสดงข้อมูลใหม่ทาง browser
ไม่จำเป็น ต้อง Restart webserver ครับ ลองๆ
ดูแล้ว ก็ใช้งานได้

ผมใช้ AppServ mysql เป็น ฐานข้อมูล ก็ใช้งานได้ เปลี่ยนจาก ??? มาเป็น ภาษาไทยได้ทันที

ตัวอย่าง เช่น
class EbitController < ApplicationController
before_filter :configure_charsets

def configure_charsets
@headers["Content-Type"] = "text/html; charset=TIS620"

suppress(ActiveRecord::StatementInvalid) do
ActiveRecord::Base.connection.execute 'SET NAMES TIS620'
end

end #def

...... โค้ด ส่วนอื่นๆ เช่น def

end #class
----------------------------------

จริงๆแล้วก็ไม่เข้าใจความหมายหรอก
อ่านมาจาก คนที่ชำนาญกว่า ที่เวปนี้ครับ
http://weblog.punneng.com/index.php?m=200607&paged=2

Ruby update ข้อมูล กับ database ด้วย console

หลังจาก ลองมั่วๆ Ruby OnRails มาสักสามสี่วันแล้ว มึนๆเลย

ก็เลยลองทวน basic กันหน่อย
โดยใช้

Ruby script/console เพื่อช่วยเรียน rubyเอง

สร้าง model ชื่อว่า user (table users )
ด้วย ruby script/generate model user user <-- ไม่ค่อยแน่ใจ
กับ controller
ด้วย ruby script/generator scaffold mydb user
แล้วเปิด ruby script/server เป็น web server
แล้ว เข้า page ด้วย http://localhost:3000/user

พอดีต้อง ปรับปรุง model แต่ไม่ค่อยเข้าใจ ActiveRecord เลยหาทาง
ทำความเข้าใจ ก็เลย ลองใช้วิธี console ช่วยให้เข้าใจ มากนิดนึง

ก็ เปิด ruby script/console
ทีนี้ ลองสร้าง
u = User.new ( ) ทำเท่าไร ก็ error เลยหาข้อมูลสักพัก หลังจากไปนั่งอ่านเวปสนุกๆ
พอ กลับมา ก็เปิด fxri ปรากฏว่าโหลดนานพอดู เพราะเครื่องช้าไปนิด
แล้วก็ ใส่ keyword ลองเดามั่วๆ หาคำว่า connection

พบ ActiveRecord::Base.establish_connection ก็เป็นการเดาล้วนๆ
เดาจาก ADODB ของ VB6 เพราะว่า ก่อน ใช้ RecordSet ต้องเปิด connectionก่อน
เพราะ เดิม แจ้ง error ว่า login เข้าเบส ไม่ได้คล้ายๆ ไม่มี การใส่ password

ได้คำอธิบายว่า ทำแนวๆนี้
ActiveRecord::Base.establish_connection( :adapter => "mysql", :host => "localhost", :username => "myuser", :password => "mypass", :database => "somedatabase" )

ก็เลยแก้ไขนิดหน่อย แล้วก็ไป Paste ใน console
ผลคือ มันคล้ายๆทำงานแทน database.yml ใน directroy config
ซึ่งก็คือ มีการเปิด connection ใหม่ให้
คราวนี้
ก็ลอง

u = User.new( )
ได้ผล ใช้งานได้ ได้ instance u สำหรับจัดการ Table Users มาแล้ว

ทีนี้ลองใช้ ดึงข้อมูลล่ะ
rows = User.find ( :all ) ได้ผลครับ ออกมา 2 แถว
อ้างได้ด้วย
rows[0].name = "new name"
rows[0].save
ผล คือ database ใน phpMyAdmin เปลี่ยนตามทันทีเลย

หรือจะลองด้วย เงื่อนไข where กับ first
cond = [ "name=? and password = ? " , "myname" ,"mypass" ]
row = User.find (:first , :conditions => cond )
ก็ได้ผลเหมือนกัน แต่ได้ แถวเดียว
แล้วแก้ไขโดย
row.name= "newname1"
row.save


หากจะค้นหาด้วยเงื่อนไขอื่นๆ อาจใช้ like เช่น
row = User.find(:first, :conditions=> "name like '%user%'" ) ก็ได้