Rails 4路由约束仅包含查询字符串或数字

时间:2016-03-14 03:27:22

标签: ruby-on-rails ruby rest ruby-on-rails-4 routes

我试图用约束来实现这两条路线:

get "products/:id", to: "products#show", constraints: { id: /\d/ }
get "products/:name", to: "products#search", constraints: { name: /[a-zA-Z]/ }

第一条路线应使用localhost:3000/products/3之类的网址触发,最后一条路线应以localhost:3000/products/?name=juice触发。

没有用,我搜索了很多关于这个问题但是我似乎找到了Ruby on Rails的第二个或第三个版本的解决方案,而且现在大多数都被弃用了。

有什么想法吗?感谢。

4 个答案:

答案 0 :(得分:5)

如果您喜欢结果网址的外观,可以按原样使用这些路线。不需要查询字符串。

在你的控制器中,你有以下几点:

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

您可能希望对find_by返回nil进行错误检查,因为:name与任何内容都不匹配,但基本上就是这样。

您的routes.rb将具有原始路线定义:

get "products/:id", to: "products#show", constraints: { id: /[[:digit]]/ }
get "products/:name", to: "products#search", constraints: { name: /[[:alpha:]]/ }

您的申请应该同时回复:

  • 本地主机:3000 /产品/ 3
  • 本地主机:3000 /产品/果汁

答案 1 :(得分:1)

首先你必须知道查询字符串和网址是什么。 localhost:3000/products/3这是网址,三是符号:id,当使用问号localhost:3000/products/3?name=juice时,name = juice是查询字符串。

所以get "products/:name", to: "products#search", constraints: { name: /[a-zA-Z]/ }你应该替换下面的

get "products/:id?name=:name", to: "products#search", constraints: { id: /\d/,
                                                                name: /[a-zA-Z]/ }

示例:localhost:3000 / products / 3?name = xxxxx

答案 2 :(得分:1)

我有一种感觉,正则表达式匹配在路线上可能有点不同 - 我认为它每次都会锚定到参数的开始和结束。

考虑到这一点,你的正则表达式每个匹配一个字符。请改为 % Create data t = -4:0.1:40; % Time data x = t; % Position data y = x; % Position data x1 = x; y1 = -y; h = plot(x(1),y(1),'o','MarkerSize',20,'MarkerFaceColor','g'); hold on h1 = plot(x1(1),y1(1),'o','MarkerSize',20,'MarkerFaceColor','r'); hold on xlim([0,50]); ylim([-50,50]); grid on % Animation Loop one i = 1; while i<=length(x) set(h,'XData',x(i), 'YData',y(i)); set(h1,'XData',x1(i), 'YData',y1(i)); drawnow; M(i) = getframe(1); i=i+1; end id: /\d+/

答案 3 :(得分:0)

指定不同的路线可能更容易,更Railsy:

get "products/:id",          to: "products#show"
get "products/search/:name", to: "products#search"

或者,只需将products#index操作句柄params[:q]作为搜索字符串,这也很常见。然后您的网址为www.example.com/products?q=juice