[#13775] Problems with racc rule definitions — Michael Neumann <neumann@...>

15 messages 2001/04/17
[#13795] Re: Problems with racc rule definitions — Minero Aoki <aamine@...> 2001/04/18

Hi,

[#13940] From Guido, with love... — Dave Thomas <Dave@...>

52 messages 2001/04/20

[#13953] regexp — James Ponder <james@...>

Hi, I'm new to ruby and am coming from a perl background - therefore I

19 messages 2001/04/21

[#14033] Distributed Ruby and heterogeneous networks — harryo@... (Harry Ohlsen)

I wrote my first small distributed application yesterday and it worked

15 messages 2001/04/22

[#14040] RCR: getClassFromString method — ptkwt@...1.aracnet.com (Phil Tomson)

It would be nice to have a function that returns a class type given a

20 messages 2001/04/22

[#14130] Re: Ruby mascot proposal — "Conrad Schneiker" <schneik@...>

Guy N. Hurst wrote:

21 messages 2001/04/24
[#14148] Re: Ruby mascot proposal — Stephen White <spwhite@...> 2001/04/24

On Tue, 24 Apr 2001, Conrad Schneiker wrote:

[#14188] Re: Ruby mascot proposal — matz@... (Yukihiro Matsumoto) 2001/04/25

Hi,

[#14193] Re: Ruby mascot proposal — "W. Kent Starr" <elderburn@...> 2001/04/25

On Tuesday 24 April 2001 23:02, Yukihiro Matsumoto wrote:

[#14138] Re: python on the smalltalk VM — Conrad Schneiker <schneik@...>

FYI: Thought this might be of interest to the JRuby and Ruby/GUI folks.

27 messages 2001/04/24
[#14153] Re: python on the smalltalk VM — Andrew Kuchling <akuchlin@...> 2001/04/24

Conrad Schneiker <schneik@austin.ibm.com> writes:

[#14154] array#flatten! question — Jim Freeze <jim@...> 2001/04/24

Hello.

[#14159] Can I insert into an array — Jim Freeze <jim@...> 2001/04/24

Ok, this may be a dumb question, but, is it possible to insert into an

[#14162] Re: Can I insert into an array — Dave Thomas <Dave@...> 2001/04/24

Jim Freeze <jim@freeze.org> writes:

[#14289] RCR: Array#insert — Shugo Maeda <shugo@...> 2001/04/27

At Wed, 25 Apr 2001 01:28:36 +0900,

[#14221] An or in an if. — Tim Pettman <tjp@...>

Hi there,

18 messages 2001/04/25

[#14267] Re: Ruby mascot proposal — "Conrad Schneiker" <schneik@...>

Danny van Bruggen,

16 messages 2001/04/26

[#14452] How to do it the Ruby-way 3 — Stefan Matthias Aust <sma@3plus4.de>

First a question: Why is

21 messages 2001/04/30

[ruby-talk:13645] Re: Off-topic: General flow of a (specific kind of) CGI

From: Michael Neumann <neumann@...>
Date: 2001-04-13 11:02:14 UTC
List: ruby-talk #13645
Hal E. Fulton wrote:
> Hi guys, 
> 
> This is an offtopic post, which I rationalize in the 
> following ways:
>    1. I do plan ultimately to write CGIs in Ruby (though
>        I've done only the most primitive stuff so far)
>    2. I know this community to be a knowledgeable
>        and tolerant one
>    3. I'm atoning by posting a bit of Ruby code 
>        in the next message

I've written something similar, but a bit complexer.
I've created a formular definition (you could do this e.g. in XML, 
but Ruby code would suffice). This definition is then shown by a 
CGI script. 
If the user presses submit, then the formular-data is send to another 
CGI script which also reads in the formular definition (because there's 
a validation type in there) and checks each field for validation, 
and shows the whole formular with the new values, and if errors occured
the error messages next to the fields. 
And the formular data is stored in a XML-database (simple XML-file).

Of course this does not make sense if you want to show only one or two
formular, but if you plan to develop many formulars which look like each
other, then this could be a good idea.


> 
> My question is:
> 
> I've written a primitive CGI or two in the past, which will
> accept the data from a form and process it. Usually I
> error-check the input and give the user a "go back" 
> button if it isn't right.
> 
> Isn't there a technique for sort of encapsulating the whole
> thing, even the initial HTML? (I.e., generate the initial HTML
> from the CGI instead of static HTML that points to the 
> script?)

Let the CGI script create the HTML, by outputting HTML code.

> Something like:
>     If I have no input, display the blank form


# Submit-button: <input type="submit" name="submit" value="Send">

if cgi.has_key? "submit"
  # check for errors and redisplay the formular
else
  # output the blank formular
end


>     If I have input and the special invisible error fields are 
>       non-null, redisplay the form with the original input and
>       the error messages
>     If I have input and all is OK, process the input
> 
> I'd like to have a form with three columns (probably use
> tables): A column of labels like "Name:"; a column of
> text fields; and a column of blank invisible fields that 
> fill up with ugly red error messages on demand.
> 
> What is the general flow of such an animal? Can someone
> post a short example in Ruby, say with one or two fields? 
> I don't know much web stuff, and it always makes my brain 
> itch until I relearn the basics each time.

I'd do it like this (of course this should be extended):

# file: form.def
# formular definition
form {
  field :label => "Name",   :name => "name",   :validator => :NonEmpty
  field :label => "Street", :name => "street", :validator => :NonEmpty
}

######

# file: show.rb
# now the file that creates a HTML formular

require "cgi"

def form
  print %{
  <html><body><form method="POST" action="process.rb">
  <input type="hidden" name="formular" value="#{$formular}">
  }

  yield

  print %{
  </form></body></html>
  }
end

def field(h)
  value = # ... get the value from a database ?

  print %{
  <input type="text" name="#{ h[:name] }" value="#{value}">  
  }
end

def show_form(filename)
  eval File.readlines(filename).to_s
end

cgi = CGI.new
print "Content-type: text/html\r\n\r\n"
show_form(cgi["formular"][0] + ".def") 


# to show call: http://....../cgi-bin/show.rb?formular=form




######

# file: process.rb
# checks the input of the formular
 
require "cgi"
cgi = CGI.new


def form
  $str +=  %{
  <html><body><form method="POST" action="process.rb">
  }

  yield

  $str +=  %{
  </form></body></html>
  }
end

def field(h)
  value = $cgi[h[:name]][0]
  # validate here:
  #   you can write validator classes and then create an
  #   instance of it using: 
  #     val = eval "# { h[:validator] }.new }
  #     val.validate(value)

  $str += %{
  <input type="text" name="#{ h[:name] }" value="#{value}">  
  }

  if error then
    $str += "This field contains invalid input"
    $errors += 1
  end
end

def show_form(filename)
  eval File.readlines(filename).to_s
end

$str = ""
$errors = 0
$cgi = CGI.new
print "Content-type: text/html\r\n\r\n"
show_form(cgi["formular"][0] + ".def") 

if $errors == 0
  # no errors, do what you want
else
 print $str
end



##########

Well I've not tested this, but with some changes it should work.


Regards

Michael













In This Thread

Prev Next