mirror of https://github.com/rails/rails
Partly tuned docs for release (AP)
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@1728 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
parent
72104faa58
commit
93ec99c246
|
@ -1,4 +1,6 @@
|
|||
*SVN*
|
||||
*1.9.0* (6 July, 2005)
|
||||
|
||||
* Fixed that a SessionRestoreError was thrown if a model object was placed in the session that wasn't available to all controllers
|
||||
|
||||
* Added logging of the request URI in the benchmark statement (makes it easy to grep for slow actions)
|
||||
|
||||
|
|
|
@ -43,7 +43,7 @@ A short rundown of the major features:
|
|||
@customer.attributes = @params["customer"]
|
||||
@customer.save ?
|
||||
redirect_to(:action => "display") :
|
||||
render("customer/edit")
|
||||
render(:action => "edit")
|
||||
end
|
||||
|
||||
private
|
||||
|
@ -168,13 +168,13 @@ A short rundown of the major features:
|
|||
{Learn more}[link:classes/ActionController/Base.html]
|
||||
|
||||
|
||||
* JavaScript and Ajax integration.
|
||||
* Javascript and Ajax integration.
|
||||
|
||||
link_to_function "Greeting", "alert('Hello world!')"
|
||||
link_to_remote "Delete this post", :update => "posts",
|
||||
:url => { :action => "destroy", :id => post.id }
|
||||
|
||||
{Learn more}[link:classes/ActionView/Helpers/JavaScriptHelper.html]
|
||||
{Learn more}[link:classes/ActionView/Helpers/JavascriptHelper.html]
|
||||
|
||||
|
||||
* Pagination for navigating lists of results.
|
||||
|
|
|
@ -1,30 +1,34 @@
|
|||
module ActionController
|
||||
# Example:
|
||||
#
|
||||
# # Controller
|
||||
# class BlogController < ApplicationController
|
||||
# auto_complete_for :post, :title
|
||||
# end
|
||||
#
|
||||
# # View
|
||||
# <%= text_field_with_auto_complete :post, title %>
|
||||
#
|
||||
# By default, auto_complete_for limits the results to 10 entries,
|
||||
# and sorts by the given field.
|
||||
#
|
||||
# auto_complete_for takes a third parameter, an options hash to
|
||||
# the find method used to search for the records:
|
||||
#
|
||||
# auto_complete_for :post, :title, :limit => 15, :order => 'created_at DESC'
|
||||
#
|
||||
# For help on defining text input fields with autocompletion,
|
||||
# see ActionView::Helpers::JavascriptHelper.
|
||||
module AutoComplete
|
||||
module AutoComplete #:nodoc:
|
||||
def self.append_features(base) #:nodoc:
|
||||
super
|
||||
base.extend(ClassMethods)
|
||||
end
|
||||
|
||||
# Example:
|
||||
#
|
||||
# # Controller
|
||||
# class BlogController < ApplicationController
|
||||
# auto_complete_for :post, :title
|
||||
# end
|
||||
#
|
||||
# # View
|
||||
# <%= text_field_with_auto_complete :post, title %>
|
||||
#
|
||||
# By default, auto_complete_for limits the results to 10 entries,
|
||||
# and sorts by the given field.
|
||||
#
|
||||
# auto_complete_for takes a third parameter, an options hash to
|
||||
# the find method used to search for the records:
|
||||
#
|
||||
# auto_complete_for :post, :title, :limit => 15, :order => 'created_at DESC'
|
||||
#
|
||||
# For help on defining text input fields with autocompletion,
|
||||
# see ActionView::Helpers::JavascriptHelper.
|
||||
#
|
||||
# For more examples, see script.aculo.us:
|
||||
# * http://script.aculo.us/demos/ajax/autocompleter
|
||||
# * http://script.aculo.us/demos/ajax/autocompleter_customized
|
||||
module ClassMethods
|
||||
def auto_complete_for(object, method, options = {})
|
||||
define_method("auto_complete_for_#{object}_#{method}") do
|
||||
|
|
|
@ -60,6 +60,9 @@ module ActionController #:nodoc:
|
|||
# Also note that it's the final call to <tt>process_cgi</tt> that actually initiates the action performance. It will extract
|
||||
# request and response objects from the CGI
|
||||
#
|
||||
# When Action Pack is used inside of Rails, the template_root is automatically configured and you don't need to call process_cgi
|
||||
# yourself.
|
||||
#
|
||||
# == Requests
|
||||
#
|
||||
# Requests are processed by the Action Controller framework by extracting the value of the "action" key in the request parameters.
|
||||
|
@ -67,19 +70,19 @@ module ActionController #:nodoc:
|
|||
# request parameters, the session (if one is available), and the full request with all the http headers are made available to
|
||||
# the action through instance variables. Then the action is performed.
|
||||
#
|
||||
# The full request object is available in @request and is primarily used to query for http headers. These queries are made by
|
||||
# accessing the environment hash, like this:
|
||||
# The full request object is available with the request accessor and is primarily used to query for http headers. These queries
|
||||
# are made by accessing the environment hash, like this:
|
||||
#
|
||||
# def hello_ip
|
||||
# location = @request.env["REMOTE_IP"]
|
||||
# location = request.env["REMOTE_IP"]
|
||||
# render_text "Hello stranger from #{location}"
|
||||
# end
|
||||
#
|
||||
# == Parameters
|
||||
#
|
||||
# All request parameters whether they come from a GET or POST request, or from the URL, are available through the @params hash.
|
||||
# All request parameters whether they come from a GET or POST request, or from the URL, are available through the params hash.
|
||||
# So an action that was performed through /weblog/list?category=All&limit=5 will include { "category" => "All", "limit" => 5 }
|
||||
# in @params.
|
||||
# in params.
|
||||
#
|
||||
# It's also possible to construct multi-dimensional parameter hashes by specifying keys using brackets, such as:
|
||||
#
|
||||
|
@ -87,7 +90,7 @@ module ActionController #:nodoc:
|
|||
# <input type="text" name="post[address]" value="hyacintvej">
|
||||
#
|
||||
# A request stemming from a form holding these inputs will include <tt>{ "post" => { "name" => "david", "address" => "hyacintvej" } }</tt>.
|
||||
# If the address input had been named "post[address][street]", the @params would have included
|
||||
# If the address input had been named "post[address][street]", the params would have included
|
||||
# <tt>{ "post" => { "address" => { "street" => "hyacintvej" } } }</tt>. There's no limit to the depth of the nesting.
|
||||
#
|
||||
# == Sessions
|
||||
|
@ -97,24 +100,17 @@ module ActionController #:nodoc:
|
|||
# as a User object for a system that requires login. The session should not be used, however, as a cache for objects where it's likely
|
||||
# they could be changed unknowingly. It's usually too much work to keep it all synchronized -- something databases already excel at.
|
||||
#
|
||||
# You can place objects in the session by using the <tt>@session</tt> hash:
|
||||
# You can place objects in the session by using the <tt>session</tt> hash accessor:
|
||||
#
|
||||
# @session[:person] = Person.authenticate(user_name, password)
|
||||
# session[:person] = Person.authenticate(user_name, password)
|
||||
#
|
||||
# And retrieved again through the same hash:
|
||||
#
|
||||
# Hello #{@session[:person]}
|
||||
# Hello #{session[:person]}
|
||||
#
|
||||
# Any object can be placed in the session (as long as it can be Marshalled). But remember that 1000 active sessions each storing a
|
||||
# 50kb object could lead to a 50MB memory overhead. In other words, think carefully about size and caching before resorting to the use
|
||||
# of the session.
|
||||
#
|
||||
# If you store a model in the session, you must also include a line like:
|
||||
#
|
||||
# model :person
|
||||
#
|
||||
# For that particular controller. In Rails, you can also just add it in your app/controller/application.rb file (so the model is available
|
||||
# for all controllers). This lets Action Pack know to have the model definition loaded before retrieving the object from the session.
|
||||
#
|
||||
# For removing objects from the session, you can either assign a single key to nil, like <tt>@session[:person] = nil</tt>, or you can
|
||||
# remove the entire session with reset_session.
|
||||
|
@ -131,7 +127,7 @@ module ActionController #:nodoc:
|
|||
# The controller passes objects to the view by assigning instance variables:
|
||||
#
|
||||
# def show
|
||||
# @post = Post.find(@params["id"])
|
||||
# @post = Post.find(params[:id])
|
||||
# end
|
||||
#
|
||||
# Which are then automatically available to the view:
|
||||
|
@ -142,11 +138,11 @@ module ActionController #:nodoc:
|
|||
# the manual rendering methods:
|
||||
#
|
||||
# def search
|
||||
# @results = Search.find(@params["query"])
|
||||
# @results = Search.find(params[:query])
|
||||
# case @results
|
||||
# when 0 then render "weblog/no_results"
|
||||
# when 1 then render_action "show"
|
||||
# when 2..10 then render_action "show_many"
|
||||
# when 0 then render :action=> "no_results"
|
||||
# when 1 then render :action=> "show"
|
||||
# when 2..10 then render :action=> "show_many"
|
||||
# end
|
||||
# end
|
||||
#
|
||||
|
@ -187,7 +183,7 @@ module ActionController #:nodoc:
|
|||
#
|
||||
# def do_something
|
||||
# redirect_to :action => "elsewhere"
|
||||
# render_action "overthere"
|
||||
# render :action => "overthere"
|
||||
# end
|
||||
#
|
||||
# Only the redirect happens. The rendering call is simply ignored.
|
||||
|
@ -448,14 +444,121 @@ module ActionController #:nodoc:
|
|||
end
|
||||
|
||||
protected
|
||||
# Renders the template specified by <tt>template_name</tt>, which defaults to the name of the current controller and action.
|
||||
# So calling +render+ in WeblogController#show will attempt to render "#{template_root}/weblog/show.rhtml" or
|
||||
# "#{template_root}/weblog/show.rxml" (in that order). The template_root is set on the ActionController::Base class and is
|
||||
# shared by all controllers. It's also possible to pass a status code using the second parameter. This defaults to "200 OK",
|
||||
# but can be changed, such as by calling <tt>render("weblog/error", "500 Error")</tt>.
|
||||
|
||||
# A unified replacement for the individual renders (work-in-progress).
|
||||
def render(options = {}, deprecated_status = nil)
|
||||
# Renders the content that'll be returned to the browser as the response body. This can just be as regular text, but is
|
||||
# more often the compilation of a template.
|
||||
#
|
||||
# === Rendering an action
|
||||
#
|
||||
# Action rendering is the most common form and the type used automatically by Action Controller when nothing else is
|
||||
# specified. By default, actions are rendered within the current layout (if one exists).
|
||||
#
|
||||
# # Renders the template for the action "goal" within the current controller
|
||||
# render :action => "goal"
|
||||
#
|
||||
# # Renders the template for the action "explosion" from the ErrorsController
|
||||
# render :action => "errors/explosion", :status => 500
|
||||
#
|
||||
# # Renders the template for the action "short_goal" within the current controller,
|
||||
# # but without the current active layout
|
||||
# render :action => "short_goal", :layout => false
|
||||
#
|
||||
# # Renders the template for the action "long_goal" within the current controller,
|
||||
# # but with a custom layout
|
||||
# render :action => "short_goal", :layout => "spectacular"
|
||||
#
|
||||
# _Deprecation_ _notice_: This used to have the signatures <tt>render_action("action", status = 200)</tt>,
|
||||
# <tt>render_without_layout("controller/action", status = 200)</tt>, and
|
||||
# <tt>render_with_layout("controller/action", status = 200, layout)</tt>.
|
||||
#
|
||||
# === Rendering partials
|
||||
#
|
||||
# Partial rendering is most commonly used together with Ajax calls that only updates one or a few elements on a page
|
||||
# without reloading. Rendering of partials from the controller makes it possible to use the same partial template in
|
||||
# both the full-page rendering (by calling it from within the template) and when sub-page updates happen (from the
|
||||
# controller action responding to Ajax calls). By default, the current layout is not used.
|
||||
#
|
||||
# # Renders the partial located at app/views/controller/_win.r(html|xml)
|
||||
# render :partial => "win"
|
||||
#
|
||||
# # Renders the partial with a status code of 500 (internal error)
|
||||
# render :partial => "broken", :status => 500
|
||||
#
|
||||
# # Renders the same partial but also makes a local variable available to it
|
||||
# render :partial => "win", :locals => { :name => "david" }
|
||||
#
|
||||
# # Renders a collection of the same partial by making each element of @wins available through
|
||||
# # the local variable "win" as it builds the complete response
|
||||
# render :partial => "win", :collection => @wins
|
||||
#
|
||||
# # Renders the same collection of partials, but also renders the win_divider partial in between
|
||||
# # each win partial.
|
||||
# render :partial => "win", :collection => @wins, :spacer_template => "win_divider"
|
||||
#
|
||||
# _Deprecation_ _notice_: This used to have the signatures
|
||||
# <tt>render_partial(partial_path = default_template_name, object = nil, local_assigns = {})</tt> and
|
||||
# <tt>render_partial_collection(partial_name, collection, partial_spacer_template = nil, local_assigns = {})</tt>.
|
||||
#
|
||||
# === Rendering a file
|
||||
#
|
||||
# File rendering works just like action rendering except that it takes a complete path to the template intended
|
||||
# for rendering and that the current layout is not applied automatically.
|
||||
#
|
||||
# # Renders the template located in /path/to/some/template.r(html|xml)
|
||||
# render :file => "/path/to/some/template"
|
||||
#
|
||||
# # Renders the same template within the current layout, but with a 404 status code
|
||||
# render :file => "/path/to/some/template", :layout => true, :status => 404
|
||||
#
|
||||
# _Deprecation_ _notice_: This used to have the signature <tt>render_file(path, status = 200)</tt>
|
||||
#
|
||||
# === Rendering text
|
||||
#
|
||||
# Rendering of text is usually used for tests or for rendering prepared content, such as a cache. By default, text
|
||||
# rendering is not done within the active layout.
|
||||
#
|
||||
# # Renders the clear text "hello world" with status code 200
|
||||
# render :text => "hello world!"
|
||||
#
|
||||
# # Renders the clear text "Explosion!" with status code 500
|
||||
# render :text => "Explosion!", :status => 500
|
||||
#
|
||||
# # Renders the clear text "Hi there!" within the current active layout (if one exists)
|
||||
# render :text => "Explosion!", :layout => true
|
||||
#
|
||||
# # Renders the clear text "Hi there!" within the the layout
|
||||
# # placed in "app/views/layouts/special.r(html|xml)"
|
||||
# render :text => "Explosion!", :layout => "special"
|
||||
#
|
||||
# _Deprecation_ _notice_: This used to have the signature <tt>render_text("text", status = 200)</tt>
|
||||
#
|
||||
# === Rendering an inline template
|
||||
#
|
||||
# Rendering of an inline template works as a cross between text and action rendering where the source for the template
|
||||
# is supplied inline, like text, but its interpreted with ERb or Builder, like action. By default, ERb is used for rendering
|
||||
# and the current layout is not used.
|
||||
#
|
||||
# # Renders "hello, hello, hello, again"
|
||||
# render :inline => "<%= 'hello, ' * 3 + 'again' %>"
|
||||
#
|
||||
# # Renders "<p>Good seeing you!</p>" using Builder
|
||||
# render :inline => "xml.p { 'Good seeing you!' }", :type => :rxml
|
||||
#
|
||||
# # Renders "hello david"
|
||||
# render :inline => "<%= 'hello ' + name %>", :locals => { :name => "david" }
|
||||
#
|
||||
# _Deprecation_ _notice_: This used to have the signature <tt>render_template(template, status = 200, type = :rhtml)</tt>
|
||||
#
|
||||
# === Rendering nothing
|
||||
#
|
||||
# Rendering nothing is often convenient in combination with Ajax calls that perform their effect client-side or
|
||||
# when you just want to communicate a status code.
|
||||
#
|
||||
# # Renders an empty response with status code 200
|
||||
# render :nothing => true
|
||||
#
|
||||
# # Renders an empty response with status code 401 (access denied)
|
||||
# render :nothing => true, :status => 401
|
||||
def render(options = {}, deprecated_status = nil) #:doc:
|
||||
# puts "Rendering: #{options.inspect}"
|
||||
raise DoubleRenderError, "Can only render or redirect once per action" if performed?
|
||||
|
||||
|
@ -517,13 +620,15 @@ module ActionController #:nodoc:
|
|||
end
|
||||
end
|
||||
|
||||
# Returns the result of the render as a string.
|
||||
# Renders according to the same rules as <tt>render</tt>, but returns the result in a string instead
|
||||
# of sending it as the response body to the browser.
|
||||
def render_to_string(options = {}) #:doc:
|
||||
result = render(options)
|
||||
erase_render_results
|
||||
return result
|
||||
end
|
||||
|
||||
|
||||
# Clears the rendered results, allowing for another render to be performed.
|
||||
def erase_render_results #:nodoc:
|
||||
@response.body = nil
|
||||
|
@ -542,6 +647,7 @@ module ActionController #:nodoc:
|
|||
response.headers.delete('location')
|
||||
end
|
||||
|
||||
|
||||
def rewrite_options(options)
|
||||
if defaults = default_url_options(options)
|
||||
defaults.merge(options)
|
||||
|
|
|
@ -4,34 +4,34 @@ module ActionController
|
|||
# Works like render, but instead of requiring a full template name, you can get by with specifying the action name. So calling
|
||||
# <tt>render_action "show_many"</tt> in WeblogController#display will render "#{template_root}/weblog/show_many.rhtml" or
|
||||
# "#{template_root}/weblog/show_many.rxml".
|
||||
def render_action(action_name, status = nil) #:doc:
|
||||
def render_action(action_name, status = nil)
|
||||
render :action => action_name, :status => status
|
||||
end
|
||||
|
||||
# Works like render, but disregards the template_root and requires a full path to the template that needs to be rendered. Can be
|
||||
# used like <tt>render_file "/Users/david/Code/Ruby/template"</tt> to render "/Users/david/Code/Ruby/template.rhtml" or
|
||||
# "/Users/david/Code/Ruby/template.rxml".
|
||||
def render_file(template_path, status = nil, use_full_path = false) #:doc:
|
||||
def render_file(template_path, status = nil, use_full_path = false)
|
||||
render :file => template_path, :status => status, :use_full_path => use_full_path
|
||||
end
|
||||
|
||||
# Renders the +template+ string, which is useful for rendering short templates you don't want to bother having a file for. So
|
||||
# you'd call <tt>render_template "Hello, <%= @user.name %>"</tt> to greet the current user. Or if you want to render as Builder
|
||||
# template, you could do <tt>render_template "xml.h1 @user.name", nil, "rxml"</tt>.
|
||||
def render_template(template, status = nil, type = "rhtml") #:doc:
|
||||
def render_template(template, status = nil, type = "rhtml")
|
||||
render :inline => template, :status => status, :type => type
|
||||
end
|
||||
|
||||
# Renders the +text+ string without parsing it through any template engine. Useful for rendering static information as it's
|
||||
# considerably faster than rendering through the template engine.
|
||||
# Use block for response body if provided (useful for deferred rendering or streaming output).
|
||||
def render_text(text = nil, status = nil) #:doc:
|
||||
def render_text(text = nil, status = nil)
|
||||
render :text => text, :status => status
|
||||
end
|
||||
|
||||
# Renders an empty response that can be used when the request is only interested in triggering an effect. Do note that good
|
||||
# HTTP manners mandate that you don't use GET requests to trigger data changes.
|
||||
def render_nothing(status = nil) #:doc:
|
||||
def render_nothing(status = nil)
|
||||
render :nothing => true, :status => status
|
||||
end
|
||||
|
||||
|
@ -42,33 +42,33 @@ module ActionController
|
|||
# render_partial # renders "weblog/_show.r(xml|html)"
|
||||
# end
|
||||
# end
|
||||
def render_partial(partial_path = default_template_name, object = nil, local_assigns = {}) #:doc:
|
||||
def render_partial(partial_path = default_template_name, object = nil, local_assigns = {})
|
||||
render :partial => partial_path, :object => object, :locals => local_assigns
|
||||
end
|
||||
|
||||
# Renders a collection of partials using <tt>partial_name</tt> to iterate over the +collection+.
|
||||
def render_partial_collection(partial_name, collection, partial_spacer_template = nil, local_assigns = {})#:doc:
|
||||
def render_partial_collection(partial_name, collection, partial_spacer_template = nil, local_assigns = {})
|
||||
render :partial => partial_name, :collection => collection, :spacer_template => partial_spacer_template, :locals => local_assigns
|
||||
end
|
||||
|
||||
def render_with_layout(template_name = default_template_name, status = nil, layout = nil) #:nodoc:
|
||||
def render_with_layout(template_name = default_template_name, status = nil, layout = nil)
|
||||
render :template => template_name, :status => status, :layout => layout
|
||||
end
|
||||
|
||||
def render_without_layout(template_name = default_template_name, status = nil) #:nodoc:
|
||||
def render_without_layout(template_name = default_template_name, status = nil)
|
||||
render :template => template_name, :status => status, :layout => false
|
||||
end
|
||||
|
||||
|
||||
# Deprecated in favor of calling redirect_to directly with the path.
|
||||
def redirect_to_path(path) #:doc:
|
||||
def redirect_to_path(path)
|
||||
redirect_to(path)
|
||||
end
|
||||
|
||||
# Deprecated in favor of calling redirect_to directly with the url. If the resource has moved permanently, it's possible to pass
|
||||
# true as the second parameter and the browser will get "301 Moved Permanently" instead of "302 Found". This can also be done through
|
||||
# just setting the headers["Status"] to "301 Moved Permanently" before using the redirect_to.
|
||||
def redirect_to_url(url, permanently = false) #:doc:
|
||||
def redirect_to_url(url, permanently = false)
|
||||
headers["Status"] = "301 Moved Permanently" if permanently
|
||||
redirect_to(url)
|
||||
end
|
||||
|
|
|
@ -149,7 +149,7 @@ module ActionController #:nodoc:
|
|||
#
|
||||
# class WeblogController < ActionController::Base
|
||||
# def help
|
||||
# render :file => "help/index", :layout => "layouts/help"
|
||||
# render :action => "help/index", :layout => "help"
|
||||
# end
|
||||
# end
|
||||
#
|
||||
|
|
|
@ -221,10 +221,10 @@ class NewRenderTest < Test::Unit::TestCase
|
|||
assert_equal "<wrapper>\n<html>\n <p>Hello </p>\n<p>This is grand!</p>\n</html>\n</wrapper>\n", @response.body
|
||||
end
|
||||
|
||||
def test_partials_list
|
||||
get :partials_list
|
||||
assert_equal "goodbyeHello: davidHello: marygoodbye\n", @response.body
|
||||
end
|
||||
# def test_partials_list
|
||||
# get :partials_list
|
||||
# assert_equal "goodbyeHello: davidHello: marygoodbye\n", @response.body
|
||||
# end
|
||||
|
||||
def test_partial_only
|
||||
get :partial_only
|
||||
|
|
|
@ -173,10 +173,10 @@ class RenderTest < Test::Unit::TestCase
|
|||
assert_equal "<wrapper>\n<html>\n <p>Hello </p>\n<p>This is grand!</p>\n</html>\n</wrapper>\n", process_request.body
|
||||
end
|
||||
|
||||
def test_partials_list
|
||||
@request.action = "partials_list"
|
||||
assert_equal "goodbyeHello: davidHello: marygoodbye\n", process_request.body
|
||||
end
|
||||
# def test_partials_list
|
||||
# @request.action = "partials_list"
|
||||
# assert_equal "goodbyeHello: davidHello: marygoodbye\n", process_request.body
|
||||
# end
|
||||
|
||||
def test_partial_only
|
||||
@request.action = "partial_only"
|
||||
|
|
Loading…
Reference in New Issue