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

我有一个列表表,列表模型和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

任何帮助,将不胜感激

最佳答案 你已经掌握了大部分内容,唯一的问题是如何生成实际的URL.我看到它的方式你有2个选择:

>只需使用您已有的路径:

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

这将起作用并生成像/ listings?latitude = XXX& longitude = XXX这样的路径
>如果你想要/ listings / around?…版本,你可以像这样添加:

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

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

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