我试图用约束来实现这两条路线:
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的第二个或第三个版本的解决方案,而且现在大多数都被弃用了。
有什么想法吗?感谢。
答案 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:]]/ }
您的申请应该同时回复:
答案 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
。