我正在尝试使用约束来实现这两条路线:
get "products/:id", to: "products#show", constraints: { id: /\d/ }
get "products/:name", to: "products#search", constraints: { name: /[a-zA-Z]/ }
第一个路由应该使用类似 localhost:3000/products/3
的 URL 触发,最后一个应该使用 localhost:3000/products/?name=juice
触发.
不起作用,我在谷歌上搜索了很多关于这个问题的信息,但我似乎找到了适用于第二版或第三版 Ruby on Rails 的解决方案,其中大部分现在已被弃用。
有什么想法吗?谢谢。
最佳答案
如果您喜欢生成的 URL 的外观,您可以按原样使用路由。无需查询字符串。
在你的 Controller 中,你会有类似这样的东西:
def show
@product = Product.find(params[:id])
# do stuff
end
def search
# I'm assuming your Product model has a `name` attribute
@product = Product.find_by(name: params[:name])
# do stuff
end
您可能需要对返回 nil 的 find_by
进行一些错误检查,因为 :name
没有匹配任何内容,但基本上就是这样。
您的 routes.rb 将具有您的原始路线定义:
get "products/:id", to: "products#show", constraints: { id: /[[:digit]]/ }
get "products/:name", to: "products#search", constraints: { name: /[[:alpha:]]/ }
您的应用程序应响应以下两种情况:
- 本地主机:3000/products/3
- 本地主机:3000/产品/果汁
关于ruby-on-rails - 仅具有查询字符串或数字的 Rails 4 路由约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35979076/