Rails:如何为不需要:id参数但需要2个查询参数的方法设置路由

时间:2012-03-18 04:03:05

标签: ruby-on-rails ruby routes

我有一个列表,包含一个列表模型和一个listing_controller类。我写了一个方法,需要2个参数:纬度和经度。然后它检索围绕该坐标约5公里的列表。在listing_controller中,这是我写的方法:

def around
  lat = params[:latitude]
  long = params[:longitude]
  @surroundings = Listing.where("latitude = ? and longitude = ?", lat, long)     
end

我想要做的是在我的routes.rb文件中设置一个url,当客户端浏览器调用时,它将提供纬度和经度作为2个参数。 No:id参数可以提供,因为客户端浏览器不知道id,而且数据库中可能没有任何与坐标完全匹配的条目。记住我只想搜索特定坐标周围的列表。

那我怎么在路线文件中写这个呢?

这是我的“rake routes”命令的输出

    listings        /                                      listings#index
             GET    /listings(.:format)                    listings#index
             POST   /listings(.:format)                    listings#create
 new_listing GET    /listings/new(.:format)                listings#new
edit_listing GET    /listings/:id/edit(.:format)           listings#edit
     listing GET    /listings/:id(.:format)                listings#show
             PUT    /listings/:id(.:format)                listings#update
             DELETE /listings/:id(.:format)                listings#destroy
                    /:controller(/:action(/:id))(.:format) :controller#:action

这就是我的routes.rb文件的外观:

Businesses::Application.routes.draw do

root to: 'listings#index', as: 'listings'

resources :listings
match ':controller(/:action(/:id))(.:format)'

这是我希望用作客户端浏览器的url字符串:

http://localhost:3000/listings/around?latitude=XXX&longitude=XXXX

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:2)

你已经掌握了大部分内容,唯一的问题是如何生成实际的URL。我认为你有两种选择:

  1. 只需使用您已有的路径:

    listings_path( :latitude => lat, :longitude => lng )
    

    这将有效并生成类似/listings?latitude=XXX&longitude=XXX

  2. 的路径
  3. 如果您想要/listings/around?...版本,可以像这样添加:

    # routes.rb
    resources :listings do
      collection do
        get :around
      end
    end
    

    然后你可以像这样制作你的网址:

    around_listings_path( :latitude => lat, :longitude => lng )
    

答案 1 :(得分:0)

尝试将“around”动作设置为集合:

resources :listings do
  get :around, :on => :collection
end

在你看来

=link_to around_listings_path(:latitude => lat, :longitude => long)