Ruby on Rails脚手架 - 修改显示方法

时间:2010-06-25 02:06:33

标签: ruby-on-rails show scaffolding

对于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])”。但是,这不起作用,所以有人请告诉我如何使用其他参数进行搜索。谢谢!

2 个答案:

答案 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]])

: - )