2010-06-25 44 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