对于Ruby on Rails,我是初学者,所以我需要一些帮助。我最近开始阅读一本基础教程,这是用Scaffolding教授的。我做了一个“客户端”模型:脚本/生成脚手架客户端名称:string ip_address:string speed:integer ...在clients_controller.rb文件中,有一个名为show的方法:
# 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
对于查询,我会转到localhost:3000 / clients / {在此处输入ID}。这个参数不是用ID搜索,而是想用另一个值搜索,比如ip_address或speed,所以我认为我所要做的就是更改:id to:ip_address in“@client = Client.find( PARAMS [:ID])”。但是,这不起作用,所以有人请告诉我如何使用其他参数进行搜索。谢谢!
答案 0 :(得分:1)
由于路由方式
,这不起作用当您执行类似
的操作时 map.resources :client
(见config/routes.rb
)
使用脚手架时会自动发生这种情况。 它根据您使用id的假设设置路线。
其中一条路线类似于
map.connect 'clients/:id', :controller => 'client', :action => 'show'
因此:id
作为参数传递,作为网址的一部分。
除非它们是不同的,否则你不应该将IP作为主要标识符 - 即使这样,它也会与RESTful路由混淆。
如果您希望能够按IP搜索,请修改客户端的索引操作
def index
if params[:ip].present?
@clients = Client.find_by_ip_address(params[:ip]);
else
@clients = Client.all
end
end
然后您可以通过转到clients?ip=###.###.###
答案 1 :(得分:0)
routes.rb文件中的这一行
map.connect 'clients/:id', :controller => 'client', :action => 'show'
意味着当调度程序使用GET方法接收格式为“clients / abcdxyz”的URI时,它会将其重定向到show方法,其值为“abcdxyz”,在params散列中使用key:id。
修改
由于您使用了scaffold,因此客户端资源将是RESTful。这意味着当您向“/ clients /:id”URI发送GET请求时,您将被重定向到显示该特定客户端的页面。
在您的控制器代码中,您可以将其作为
进行访问params[:id] # which will be "abcdxyz"
由scaffold生成的find方法搜索主键,即'id'列。您需要将该语句更改为
@client = Client.find_by_ip_address(params[:id]) #find_by_column_name
OR
@client = Client.find(:first, :conditions => [":ip_address = ?", params[:id]])
: - )