1

私は開発サイクルにかなり沿ったファッションeコマースアプリを構築してきました。男性用と女性用の両方の製品に対応しています。現時点では、ユーザーは最初に性別を選択し、gender_idがユーザーのセッションに渡されます。このIDは、サイト全体の多くのクエリで使用され、ユーザーに表示される性別の商品を決定します。

ただし、SEOの目的で、この情報はセッションではなくURLに表示される必要があります。このように、リンクごとに性別パラメータを渡す必要はありません...

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

基本的に私がやりたいのは、ルートに性別を入力し、それを維持することです。URLが次のように構成されているサイトを見たことがあります...

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

コントローラへの影響を最小限に抑えて、この2番目の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 が生成されcart_pathた場合、URL は/men/cart. 性別を選択したら、それらを適切なスコープパスにリダイレクトできます。私が見る 1 つの問題は、この方法では製品とカートの停止されていないルートが失われることです。

于 2012-05-30T13:40:51.380 に答える
2

デフォルトGETのパラメーターをルートに渡すことができます。たとえば、以下のパターンは一致し、params ハッシュに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/}
于 2012-05-30T13:30:20.543 に答える
1

HTTP-GET を実行する代わりに、URL で変数を渡さない HTTP-POST を確認することをお勧めします。たとえば、1 つの HETT-GET アクションと 1 つの HTTP-POST アクションを含む単純な HTML ページを次に示します。

<!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>

POST または GET アクションを実行したかどうかを検出し、それをページに出力する単純な PHP ページ (post_get2.php) を次に示します。

<!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 に答える