In a wiki, routes are handling
web_index /:web {:controller=>“wiki”, :action=>“index”}
web_topic /:web/:topic {:controller=>“wiki”, :action=>“view”}
action /:web/:topic/:action {:controller=>“wiki”}
That is the default action is “view”.
Two questions:
-
Can I constrain the patterns allowed for “:web” and “:topic”
-
Can I use that for something like
webtopic /:web.:topic {:controller=>“wiki”, :action=>“view”}
Obviously part of the constraint is that neither part can contain a
period.
–
TCP/IP Illustrated… Is that the swimsuit edition? – rgh22
The answer to the first question is yes.
You can do something like this:
map.date “blog/:year/:month/:day”,
:controller => “blog”,
:action => “show_date”,
:requirements => { :year => /(19|20)\d\d/, :month => /[01]?\d/, :day
=> /[0-3]?\d/ },
:day => nil,
:month => nil
(Page 404 of Agile Web D. with Rails 2nd Ed)
If :web and :topic are user created, you should probably also use
active record validations validates_format_of …
The answer to question 2 is I think so since the standard routes
include .:format
Is this something that varies with the version of Rials,because I’m
having problems with it.
I have in config/routes.rb:
map.with_options(:controller => ‘wiki’) do |wiki|
wiki.web ‘:web’, :action => ‘view’,
:topic => ‘HomePage’,
:requirements => {
:web => %r{[A-Z][a-z]+}
}
wiki.web_topic ':web/:topic', :action => 'view',
:requirements => {
:web => %r{[A-Z][a-z]+},
:topic => %r{([A-Z][a-z])+{2,}}
}
# Everything else
wiki.connect '*url', :action => 'view_by_url'
end
Before I added the ‘requirements’ the following were caught correctly
/System
/System/CamelWord
After I added the ‘requirements’ everything ended up as ‘view_by_url’
I’ve simplified the patterns all the way down, but I think they are
right. I’ve tested at http://regexlib.com/
I’ve tried more “complicated” patterns: start of word/string markers,
explicit quantifiers, groupings, greedy and ungreedy. No avail.
I always end up with the ‘view_by_url’ catch-all.
I’m don’t see how “:format” is relevant. Could you expand on tat
please.
ptontiger said the following on 11/12/07 07:34 PM:
:month => nil
In a wiki, routes are handling
- Can I use that for something like
webtopic /:web.:topic {:controller=>“wiki”, :action=>“view”}
Obviously part of the constraint is that neither part can contain a period.
–
“It’s better to light a candle than to curse the darkness.”
- Eleanor Roosevelt
I have part of that working.
This part:
wiki.web_topic ‘:web/:topic’, :action => ‘view’,
:web => nil,
:topic => nil,
:requirements => {
:web => /[A-Z][a-z]+/,
:topic => /([A-Z][a-z])+{2,}/,
}
I do need to make the regular expressions more comprehensive, though.
But if extend it to:
wiki.web_topic_action ‘:web/:topic/:action’,
:requirements => {
:web => /[A-Z][a-z]+/,
:topic => /([A-Z][a-z])+{2,}/,
:action => /[a-z][a-z_]{3,}/
}
I don’t get matches. I also don’t get matches on a simpler, easier to
test variation:
wiki.web_action ‘:web/:action’,
:requirements => {
:web => /[A-Z][a-z]+/,
:action => /[a-z][a-z_]{3,}/
}
I take it that the "nil’ makes the field optional and if there is no
‘nil’ then its mandatory. Is there a way to supply a default?
If so, does it have to be a fixed string or can I pull it out of a
configuration table in the database?
ptontiger said the following on 11/12/07 07:34 PM:
:month => nil
In a wiki, routes are handling
- Can I use that for something like
webtopic /:web.:topic {:controller=>“wiki”, :action=>“view”}
Obviously part of the constraint is that neither part can contain a period.
–
When I used to teach creative writing, I would tell the students to make
their characters want something right away even if it’s only a glass of
water. Characters paralyzed by the meaninglessness of modern life still
have to drink water from time to time.
–Kurt Vonnegut
Anton J Aylward said the following on 15/12/07 04:37 PM:
I have part of that working.
This part:
wiki.web_topic ‘:web/:topic’, :action => ‘view’,
:web => nil,
:topic => nil,
:requirements => {
:web => /[A-Z][a-z]+/,
:topic => /([A-Z][a-z])+{2,}/,
}
WHOOP!
Let me take that back. No it doesn’t work.
ActionController::RoutingError (No route matches “/System/HomePage” with
{:method=>:get}):
–
Hell must be like a karaoke bar