永久URL参数

时间:2012-05-30 13:10:53

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

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

但是,出于搜索引擎优化的目的,必须在URL中显示此信息,而不是会话。我不想为我所做的每个链接传递性别参数,比如这个...

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

基本上我想做的是将性别输入到路线中,然后保留。我看到一些网站的URL结构如下......

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

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

3 个答案:

答案 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'

不同