2004-11-23 20:04:44 -05:00
module ActionView
module Helpers
# Provides a set of methods for making easy links and getting urls that depend on the controller and action. This means that
# you can use the same format for links in the views that you do in the controller. The different methods are even named
# synchronously, so link_to uses that same url as is generated by url_for, which again is the same url used for
# redirection in redirect_to.
module UrlHelper
2005-03-06 12:35:52 -05:00
# Returns the URL for the set of +options+ provided. This takes the same options
# as url_for. For a list, see the url_for documentation in link:classes/ActionController/Base.html#M000079.
2004-11-23 20:04:44 -05:00
def url_for ( options = { } , * parameters_for_method_reference )
2005-03-14 18:24:47 -05:00
options = { :only_path = > true } . update ( options . symbolize_keys ) if options . kind_of? Hash
2004-11-23 20:04:44 -05:00
@controller . send ( :url_for , options , * parameters_for_method_reference )
end
# Creates a link tag of the given +name+ using an URL created by the set of +options+. See the valid options in
# link:classes/ActionController/Base.html#M000021. It's also possible to pass a string instead of an options hash to
2005-03-06 06:50:41 -05:00
# get a link tag that just points without consideration. If nil is passed as a name, the link itself will become the name.
# The html_options have a special feature for creating javascript confirm alerts where if you pass :confirm => 'Are you sure?',
2005-01-04 19:38:09 -05:00
# the link will be guarded with a JS popup asking that question. If the user accepts, the link is processed, otherwise not.
2005-02-19 06:33:32 -05:00
#
# Example:
# link_to "Delete this page", { :action => "destroy", :id => @page.id }, :confirm => "Are you sure?"
2005-03-06 06:50:41 -05:00
def link_to ( name , options = { } , html_options = nil , * parameters_for_method_reference )
2005-03-26 06:37:08 -05:00
html_options = ( html_options || { } ) . stringify_keys
2005-03-06 06:50:41 -05:00
convert_confirm_option_to_javascript! ( html_options )
2004-11-23 20:04:44 -05:00
if options . is_a? ( String )
2005-03-06 06:50:41 -05:00
content_tag " a " , name || options , ( html_options || { } ) . merge ( " href " = > options )
2004-11-23 20:04:44 -05:00
else
2005-01-04 19:38:09 -05:00
content_tag (
2005-03-06 06:50:41 -05:00
" a " , name || url_for ( options , * parameters_for_method_reference ) ,
( html_options || { } ) . merge ( " href " = > url_for ( options , * parameters_for_method_reference ) )
2005-01-04 19:38:09 -05:00
)
2004-11-23 20:04:44 -05:00
end
end
2005-03-22 08:09:44 -05:00
# This tag is deprecated. Combine the link_to and AssetTagHelper::image_tag yourself instead, like:
2005-03-09 08:53:47 -05:00
# link_to(image_tag("rss", :size => "30x45", :border => 0), "http://www.example.com")
2005-02-19 06:33:32 -05:00
def link_image_to ( src , options = { } , html_options = { } , * parameters_for_method_reference )
2004-12-09 18:18:25 -05:00
image_options = { " src " = > src . include? ( " / " ) ? src : " /images/ #{ src } " }
2005-03-06 06:50:41 -05:00
image_options [ " src " ] += " .png " unless image_options [ " src " ] . include? ( " . " )
html_options = html_options . stringify_keys
2004-12-09 18:18:25 -05:00
if html_options [ " alt " ]
image_options [ " alt " ] = html_options [ " alt " ]
html_options . delete " alt "
else
image_options [ " alt " ] = src . split ( " / " ) . last . split ( " . " ) . first . capitalize
end
if html_options [ " size " ]
image_options [ " width " ] , image_options [ " height " ] = html_options [ " size " ] . split ( " x " )
html_options . delete " size "
end
2004-12-09 19:02:14 -05:00
if html_options [ " border " ]
image_options [ " border " ] = html_options [ " border " ]
html_options . delete " border "
end
2005-03-06 06:50:41 -05:00
2004-12-09 18:18:25 -05:00
if html_options [ " align " ]
image_options [ " align " ] = html_options [ " align " ]
html_options . delete " align "
end
link_to ( tag ( " img " , image_options ) , options , html_options , * parameters_for_method_reference )
end
2005-02-19 06:33:32 -05:00
alias_method :link_to_image , :link_image_to # deprecated name
2005-03-06 06:50:41 -05:00
# Creates a link tag of the given +name+ using an URL created by the set of +options+, unless the current
2005-02-17 07:25:52 -05:00
# request uri is the same as the link's, in which case only the name is returned (or the
2005-03-06 06:50:41 -05:00
# given block is yielded, if one exists). This is useful for creating link bars where you don't want to link
2004-11-23 20:04:44 -05:00
# to the page currently being viewed.
2005-03-06 09:06:33 -05:00
def link_to_unless_current ( name , options = { } , html_options = { } , * parameters_for_method_reference , & block )
link_to_unless current_page? ( options ) , name , options , html_options , * parameters_for_method_reference , & block
end
# Create a link tag of the given +name+ using an URL created by the set of +options+, unless +condition+
# is true, in which case only the name is returned (or the given block is yielded, if one exists).
def link_to_unless ( condition , name , options = { } , html_options = { } , * parameters_for_method_reference , & block )
if condition
if block_given?
block . arity < = 1 ? yield ( name ) : yield ( name , options , html_options , * parameters_for_method_reference )
else
2004-11-23 20:04:44 -05:00
html_escape ( name )
2005-03-06 09:06:33 -05:00
end
2004-11-23 20:04:44 -05:00
else
2005-02-17 07:25:52 -05:00
link_to ( name , options , html_options , * parameters_for_method_reference )
2005-03-06 09:06:33 -05:00
end
end
# Create a link tag of the given +name+ using an URL created by the set of +options+, if +condition+
# is true, in which case only the name is returned (or the given block is yielded, if one exists).
def link_to_if ( condition , name , options = { } , html_options = { } , * parameters_for_method_reference , & block )
link_to_unless ! condition , name , options , html_options , * parameters_for_method_reference , & block
2004-11-23 20:04:44 -05:00
end
# Creates a link tag for starting an email to the specified <tt>email_address</tt>, which is also used as the name of the
# link unless +name+ is specified. Additional HTML options, such as class or id, can be passed in the <tt>html_options</tt> hash.
2005-01-24 08:48:24 -05:00
#
# You can also make it difficult for spiders to harvest email address by obfuscating them.
2005-04-02 03:16:57 -05:00
# Examples:
2005-02-23 07:31:05 -05:00
# mail_to "me@domain.com", "My email", :encode => "javascript" # =>
# <script type="text/javascript" language="javascript">eval(unescape('%64%6f%63%75%6d%65%6e%74%2e%77%72%69%74%65%28%27%3c%61%20%68%72%65%66%3d%22%6d%61%69%6c%74%6f%3a%6d%65%40%64%6f%6d%61%69%6e%2e%63%6f%6d%22%3e%4d%79%20%65%6d%61%69%6c%3c%2f%61%3e%27%29%3b'))</script>
#
# mail_to "me@domain.com", "My email", :encode => "hex" # =>
# <a href="mailto:%6d%65@%64%6f%6d%61%69%6e.%63%6f%6d">My email</a>
2005-04-02 03:16:57 -05:00
#
# You can also specify the cc address, bcc address, subject, and body parts of the message header to create a complex e-mail using the
# corresponding +cc+, +bcc+, +subject+, and +body+ <tt>html_options</tt> keys. Each of these options are URI escaped and then appended to
# the <tt>email_address</tt> before being output. <b>Be aware that javascript keywords will not be escaped and may break this feature
# when encoding with javascript.</b>
# Examples:
# mail_to "me@domain.com", "My email", :cc => "ccaddress@domain.com", :bcc => "bccaddress@domain.com", :subject => "This is an example email", :body => "This is the body of the message." # =>
# <a href="mailto:me@domain.com?cc="ccaddress@domain.com"&bcc="bccaddress@domain.com"&body="This%20is%20the%20body%20of%20the%20message."&subject="This%20is%20an%20example%20email">My email</a>
2004-11-23 20:04:44 -05:00
def mail_to ( email_address , name = nil , html_options = { } )
2005-03-06 06:50:41 -05:00
html_options = html_options . stringify_keys
encode = html_options . delete ( " encode " )
2005-04-02 03:16:57 -05:00
cc , bcc , subject , body = html_options . delete ( " cc " ) , html_options . delete ( " bcc " ) , html_options . delete ( " subject " ) , html_options . delete ( " body " )
2005-01-24 08:48:24 -05:00
string = ''
2005-04-02 03:16:57 -05:00
extras = ''
extras << " cc= #{ CGI . escape ( cc ) . gsub ( " + " , " %20 " ) } & " unless cc . nil?
extras << " bcc= #{ CGI . escape ( bcc ) . gsub ( " + " , " %20 " ) } & " unless bcc . nil?
extras << " body= #{ CGI . escape ( body ) . gsub ( " + " , " %20 " ) } & " unless body . nil?
extras << " subject= #{ CGI . escape ( subject ) . gsub ( " + " , " %20 " ) } & " unless subject . nil?
extras = " ? " << extras . gsub! ( / &?$ / , " " ) unless extras . empty?
2005-01-24 08:48:24 -05:00
if encode == 'javascript'
2005-04-02 03:16:57 -05:00
tmp = " document.write(' #{ content_tag ( " a " , name || email_address , html_options . merge ( { " href " = > " mailto: " + email_address . to_s + extras } ) ) } '); "
2005-01-24 08:48:24 -05:00
for i in 0 ... tmp . length
string << sprintf ( " %%%x " , tmp [ i ] )
end
" <script type= \" text/javascript \" language= \" javascript \" >eval(unescape(' #{ string } '))</script> "
elsif encode == 'hex'
for i in 0 ... email_address . length
if email_address [ i , 1 ] =~ / \ w /
string << sprintf ( " %%%x " , email_address [ i ] )
else
string << email_address [ i , 1 ]
end
end
2005-04-02 03:16:57 -05:00
content_tag " a " , name || email_address , html_options . merge ( { " href " = > " mailto: #{ string } #{ extras } " } )
2005-01-24 08:48:24 -05:00
else
2005-04-02 03:16:57 -05:00
content_tag " a " , name || email_address , html_options . merge ( { " href " = > " mailto: #{ email_address } #{ extras } " } )
2005-01-24 08:48:24 -05:00
end
2004-11-23 20:04:44 -05:00
end
2005-02-17 10:34:32 -05:00
# Returns true if the current page uri is generated by the options passed (in url_for format).
def current_page? ( options )
url_for ( options ) == @request . request_uri
end
2004-11-23 20:04:44 -05:00
private
def convert_confirm_option_to_javascript! ( html_options )
2005-03-06 06:50:41 -05:00
if confirm = html_options . delete ( " confirm " )
2005-03-06 07:07:13 -05:00
html_options [ " onclick " ] = " return confirm(' #{ confirm . gsub ( / ' / , '\\\\\'' ) } '); "
2004-11-23 20:04:44 -05:00
end
end
end
end
2005-03-06 12:35:52 -05:00
end