ผลต่างระหว่างรุ่นของ "418342 ภาคปลาย 2552/ปฏิบัติการที่ 11"

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
แถว 21: แถว 21:
  
 
end
 
end
 +
</geshi>
 +
 +
== สร้างหน้า Search ==
 +
ต่อไปเราจะทำการสร้างหน้าสำหรับให้ผู้ใช้คนหาสินค้า อันดับแรกให้เพิ่มเมธอด search ใน ProductController
 +
 +
<geshi lang="rails">
 +
  # GET /products/search?name=abc
 +
  # POST /products/search?name=abc
 +
  def search
 +
    if not params[:name].blank?
 +
      @product = Product.find_by_name(params[:name])
 +
      respond_to do |format|
 +
        if @product
 +
          flash[:notice] = "Product found!"
 +
          format.html { redirect_to(@product) }
 +
          format.xml  { render :xml => @product }       
 +
        else
 +
          format.html { flash[:notice] = "<font color=red>Product not found!</font>" }
 +
          format.xml  { render :xml => @product.errors, :status => :unprocessable_entity }
 +
        end
 +
      end
 +
    end
 +
  end
 
</geshi>
 
</geshi>

รุ่นแก้ไขเมื่อ 01:55, 5 กุมภาพันธ์ 2553

ในปฏิบัติการนี้เราจะใช้ AJAX ในการทำ autocomplete ซึ่งหมายถึงตอนที่มีการพิมพ๋ข้อความในฟอร์ม ตัวเวบแอพพลิเคชันช่วยเลือกคำที่เราต้องการพิมพ์ให้

เริ่มสร้างแอพพลิเคชัน

เราจะสร้างแอพพลิเคชันของสินค้า โดยสินค้าแต่ละอย่างจะมีสมบัติสองอย่างคือ ชื่อ (name) และราคา (price)

> rails shop
> cd shop
> ruby script/generate scaffold product name:string price:decimal
> rake db:migrate

ลงปลั๊กอิน auto_complete

โค้ดส่วนที่จะช่วยเราทำ autocomplete นั้นอยู่ในปลั๊กอินชื่อ auto_complete เราสามารถลงปลั๊กอินนี้ด้วยการสั่ง

> ruby script/plugin install auto_complete

แก้ไข controller ของ Product

สมมติว่าเราต้องการให้มีการทำ autocomplete ของฟีลด์ name ให้เราแก้ไข ProductController ดังต่อไปนี้ <geshi lang="rails"> class ProductsController < ApplicationController

 auto_complete_for :product, :name
 ...

end </geshi>

สร้างหน้า Search

ต่อไปเราจะทำการสร้างหน้าสำหรับให้ผู้ใช้คนหาสินค้า อันดับแรกให้เพิ่มเมธอด search ใน ProductController

<geshi lang="rails">

 # GET /products/search?name=abc
 # POST /products/search?name=abc
 def search
   if not params[:name].blank?
     @product = Product.find_by_name(params[:name])
     respond_to do |format|
       if @product
         flash[:notice] = "Product found!"
         format.html { redirect_to(@product) }
         format.xml  { render :xml => @product }        
       else
         format.html { flash[:notice] = "Product not found!" }
         format.xml  { render :xml => @product.errors, :status => :unprocessable_entity }
       end
     end
   end
 end

</geshi>