Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ruby / Yukihiro Matsumoto_Programming Ruby.doc
Скачиваний:
121
Добавлен:
06.06.2015
Размер:
2.71 Mб
Скачать

Creating Forms and html

CGIcontains a huge number of methods used to create HTML---one method per tag. In order to enable these methods, you must create aCGIobject by callingCGI.new, passing in the required level of HTML. For these examples, we'll use ``html3''.

To make tag nesting easier, these methods take their content as code blocks. The code blocks should return a String, which will be used as the content for the tag. For this example, we've added some gratuitous newlines to make the output fit on the page.

require "cgi"

cgi = CGI.new("html3")  # add HTML generation methods

cgi.out{

  cgi.html{

    cgi.head{ "\n"+cgi.title{"This Is a Test"} } +

    cgi.body{ "\n"+

      cgi.form{"\n"+

        cgi.hr +

        cgi.h1 { "A Form: " } + "\n"+

        cgi.textarea("get_text") +"\n"+

        cgi.br +

        cgi.submit

      }

    }

  }

}

produces:

Content-Type: text/html

Content-Length: 302

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML><HEAD>

<TITLE>This Is a Test</TITLE></HEAD><BODY>

<FORM ENCTYPE="application/x-www-form-urlencoded" METHOD="post">

<HR><H1>A Form: </H1>

<TEXTAREA NAME="get_text" COLS="70" ROWS="10"></TEXTAREA>

<BR><INPUT TYPE="submit"></FORM></BODY></HTML>

This code will produce an HTML form titled ``This Is a Test,'' followed by a horizontal rule, a level-one header, a test input area, and finally a submit button. When the submit comes back, you'll have a CGI parameter named ``get_text'' containing the text the user entered.

Cookies

You can store all kinds of interesting stuff on an unsuspecting surfer's machine using cookies. You can create a named cookie object and store a number of values in it. To send it down to the browser, set a ``cookie'' header in the call toCGI#out.

require "cgi"

cookie = CGI::Cookie.new("rubyweb", "CustID=123", "Part=ABC");

cgi = CGI.new("html3")

cgi.out( "cookie" => [cookie] ){

  cgi.html{

    "\nHTML content here"

  }

}

produces:

Content-Type: text/html

Content-Length: 86

Set-Cookie: rubyweb=CustID%3D123&Part%3DABC; path=

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML>

HTML content here</HTML>

The next time the user comes back to this page, you can retrieve the cookie values for CustIDandPart, as shown in the HTML output.

require "cgi"

cgi = CGI.new("html3")

cgi.out{

  cgi.html{

    cgi.pre{

      cookie = cgi.cookies["rubyweb"]

        "\nCookies are\n" + cookie.value.join("\n")

    }

  }

}

produces:

Content-Type: text/html

Content-Length: 111

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML><PRE>

Cookies are

CustID=123

Part=ABC</PRE></HTML>

Sessions

Cookies by themselves still need a bit of work to be useful. What we really want is a session:a persistent state for some Web surfer. Sessions are handled withCGI::Session(documented beginning on page 504), which uses cookies but provides a higher-level abstraction.

require "cgi"

require "cgi/session"

cgi = CGI.new("html3")

sess = CGI::Session.new( cgi, "session_key" => "rubyweb",

                          "session_id"  => "9650",

                          "new_session" => true,

                          "prefix" => "web-session.")

sess["CustID"] = 123

sess["Part"] = "ABC"

cgi.out{

  cgi.html{

    "\nHTML content here"

  }

}

This will send a cookie to the user named ``rubyweb'' with a value of 9650. It will also create a disk file in $TMP/web-session.9650with thekey, valuepairs forCustIDandPart.

When the user returns, all you need is a parameter to indicate the session id. In this example, that would be rubyweb=9650. With that value in the parameters, you'll be able to retrieve the full set of saved session data.

require "cgi"

require "cgi/session"

cgi = CGI.new("html3")

sess = CGI::Session.new( cgi, "session_key" => "rubyweb",

                               "prefix" => "web-session.")

cgi.out{

  cgi.html{

    "\nCustomer #{sess['CustID']} orders an #{sess['Part']}"

  }

}

Соседние файлы в папке Ruby