我一直在构建一个时尚电子商务应用程序,这个应用程序在开发周期的很长一段时间内。它适合男士和女士的产品。此时,用户在开始时选择他们的性别,然后将gender_id传递到用户的会话中。然后,此ID将用于整个站点的许多查询中,并确定用户所显示的性别产品。
但是,出于搜索引擎优化的目的,必须在URL中显示此信息,而不是会话。我不想为我所做的每个链接传递性别参数,比如这个...
http://www.shop.com/products?category=Jeans&gender=women
基本上我想做的是将性别输入到路线中,然后保留。我看到一些网站的URL结构如下......
http://www.shop.com/women/products?category=Jeans
如何实现第二个URL结构,对控制器的影响最小?或者也许我可以通过不同的方式实现目标?谢谢!
答案 0 :(得分:3)
将它放在带有范围的路线中:
scope ':gender', :constraints => {:gender => /women|men/} do
resources :products
resources :cart
# other routes here
end
您可以使用params[:gender]
访问性别。您放置在该区块中的任何路线都将限定为性别背景。
此外,在生成网址时,性别范围将默认为当前范围。例如,如果我浏览到/men/products
,并且在该视图中我有一个指向购物车的链接,如果该网址是使用cart_path
生成的,则该网址将为/men/cart
。选择性别后,您可以将其重定向到正确的范围路径。我看到的一个问题是,你使用这种方法失去了产品和购物车的不受限制的路线。
答案 1 :(得分:2)
您可以将默认GET
参数传递给您的路线。例如,下面的模式将与http://www.shop.com/women/products?category=Jeans
匹配,并自动将gender=women
附加到您的参数哈希。
get '/women/products' => 'Products#index', :gender => 'women'
get '/men/products' => 'Products#index', :gender => 'men'
您还可以通过在路径定义中使用占位符和约束来进一步概括这一点。
get '/:gender/products' => 'Products#index', :constraints => {:gender => /men|women/}
答案 2 :(得分:1)
您可能希望查看不传递URL中变量的HTTP-POST,而不是执行HTTP-GET。例如,这是一个简单的HTML页面,其中包含一个HETT-GET操作和一个HTTP-POST操作:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=ISO-8859-1">
<title>HTTP example</title>
</head>
<body>
<h1>POST & GET example</h1>
<h2> Post form</h2>
<form method="post" action="post_get2.php">
text:<input type="text" size =40 name="name">
<input type=submit value="Submit Post">
</form>
<h2> GET form</h2>
<form method="get" action="post_get2.php">
text:<input type="text" size =40 name="name">
<input type=submit value="Submit Get" >
</form>
</body>
</html>
这是一个简单的PHP页面(post_get2.php),可以检测你是否进行了POST或GET操作并将其打印在页面上:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=ISO-8859-1">
<title>HTTP example</title>
</head>
<body>
<h1>POST & GET example</h1>
<?
function stripFormSlashes($arr)
{
if (!is_array($arr))
{
return stripslashes($arr);
}
else
{
return array_map('stripFormSlashes', $arr);
}
}
if (get_magic_quotes_gpc())
{
$_GET = stripFormSlashes($_GET);
$_POST = stripFormSlashes($_POST);
}
echo ("<br/>");
echo ("<pre>");
echo ("POST info:\n");
print_r($_POST);
echo("</pre>");
echo ("<br/>");
echo ("<pre>");
echo ("GET info:\n");
print_r($_GET);
echo("</pre>");
if($_GET['name'])
{
$name = $_GET['name'];
}
echo($name);
?>
<p>
<a><input type="button" value="back" onclick="history.go(-1)"></a>
</p>
</body>
</html>
POST的好处在于它没有显示您在页面上做出的选择。它只是一直显示'http://www.shop.com/products'。与GET'http://www.shop.com/products?category=Jeans&gender=women'
不同