1

我一直在构建一个时尚电子商务应用程序,该应用程序的开发周期相当长。它适用于男士和女士产品。此刻,用户在开始时选择他们的性别,然后将gender_id 传递到用户的会话中。然后在整个站点的许多查询中使用此 ID,并确定向用户显示哪些性别产品。

但是,出于 SEO 目的,此信息必须显示在 URL 而不是会话中。我不想为我做的每个链接都传递一个性别参数,就像这样......

http://www.shop.com/products?category=Jeans&gender=women

基本上我想做的是将性别输入到路线中,并让它保持不变。我看到一些网站的 URL 结构如下......

http://www.shop.com/women/products?category=Jeans

如何在对控制器影响最小的情况下实现第二个 URL 结构?或者也许有不同的方式可以实现我的目标?谢谢!

4

3 回答 3

3

把它放在你的路线中,有一个范围:

scope ':gender', :constraints => {:gender => /women|men/} do
  resources :products
  resources :cart
  # other routes here
end

您可以使用 访问性别params[:gender]。您放置在该块中的任何路线都将限定为性别上下文。

此外,生成 url 时,性别范围将默认为当前范围。例如,如果我浏览到/men/products并在该视图中我有一个指向购物车的链接,如果 url 是用 url 生成的,cart_path那么/men/cart. 选择性别后,您可以编写将它们重定向到正确的作用域路径。我看到的一个问题是,您使用这种方法失去了产品和购物车的不间断路线。

于 2012-05-30T13:40:51.380 回答
2

您可以将默认GET参数传递给您的路线。例如,下面的模式将匹配http://www.shop.com/women/products?category=Jeans并自动附加gender=women到您的 params 哈希。

get '/women/products' => 'Products#index', :gender => 'women'
get '/men/products' => 'Products#index', :gender => 'men'

您还可以通过在路由定义中使用占位符和约束来进一步概括这一点。

get '/:gender/products' => 'Products#index', :constraints => {:gender => /men|women/}
于 2012-05-30T13:30:20.543 回答
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'

于 2012-05-30T13:13:18.310 回答