2010-06-25 111 views
0

我是Ruby on Rails的初學者,所以我需要一點幫助。我最近開始閱讀基本教程,這是使用腳手架教的。我做了一個「客戶」的模式:腳本/生成支架客戶機的名稱:字符串IP_ADDRESS:字符串速度:整數...裏面clients_controller.rb文件中,有一種稱爲顯示:Ruby on Rails腳手架 - 修改顯示方法

# GET /clients/1 
    # GET /clients/1.xml 
    def show 
    @client = Client.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @client } 
    end 
    end 

對於查詢,我'd去localhost:3000/clients/{在這裏輸入ID}。而不是使用ID搜索參數,我想用ip_address或speed等其他值進行搜索,所以我認爲所有我需要做的就是將id:改爲:ip_address in「@client = Client.find( PARAMS [:ID])」。然而,這不起作用,所以有人請告訴我如何用另一個參數來實現搜索。謝謝!

回答

1

當你做這樣的事情

map.resources :client這不起作用,因爲事物的方式被髮送

(見config/routes.rb

當您使用腳手架來自動完成。 它根據您使用ID的假設設置路線。

其中一個途徑是一樣的東西

map.connect 'clients/:id', :controller => 'client', :action => 'show'

所以:id被作爲參數傳遞的URL的一部分。

您不應該將IP作爲主標識符,除非它們是不同的 - 即使如此,它也會與RESTful路由混淆。


如果你想擁有通過IP進行搜索的能力,修改您的索引行動爲客戶

def index 
    if params[:ip].present? 
    @clients = Client.find_by_ip_address(params[:ip]); 
    else 
    @clients = Client.all 
    end 
end 

然後你就可以通過IP通過將clients?ip=###.###.###

0

這條線搜索您的routes.rb文件

map.connect 'clients/:id', :controller => 'client', :action => 'show' 

暗示當調度程序收到一個URI格式爲「clients/abcdxyz」,使用GET方法,它將重定向它以顯示具有值「abcdxyz」的方法,該方法在key:id的params散列中可用。

編輯


既然你已經使用腳手架,客戶資源將是REST風格。這意味着,當你發送一個GET請求到「/用戶/:身份證」 URI,你將被重定向到表明特定客戶端的頁面


在你的控制器代碼,您可以訪問它

params[:id] # which will be "abcdxyz" 

在主鍵即'id'列上通過腳手架搜索生成的find方法。您需要在聲明更改爲

@client = Client.find_by_ip_address(params[:id]) #find_by_column_name 

OR

@client = Client.find(:first, :conditions => [":ip_address = ?", params[:id]]) 

:-)

+0

他搭建的,這點我敢肯定,創建一個'map.resources'線,而不是一個' map.connect' – 2010-06-26 21:02:10

+0

哎呀....是的....感謝指出 – Jagira 2010-06-27 02:22:31