渲染视图

一般情况下当我们访问http://localhost:3000/demo/index时,会执行demo控制器下的index动作,而后渲染

app/views/demo/index.rhtml视图模板,将数据填充进去,并取回结果,通常是一个HTML文件,返回给WEB服务器,最后返回给

客户端浏览器。当demo控制器内没有index动作时,Rails仍然会假设你有一个名叫”index”的空动作,只是负责渲染index.rhtml视图模板。每个控制器的方法都隐含了一个 render命令,而render同时又是一个真实存在的方法,如:

def index

  render :template => “demo/index”

end指定渲染:

    如果一个控制器的动作不想渲染其默认的模板,那么我们可以调用render方法以指定渲染其他任何一个模板,整个系统中的任何一个视图模板都可以被渲染。 渲染其他动作的模板:

    比如,当用户提交了不能通过验证的数据,我们需要用户对数据作进一步修改。一般采用的方式是把用户提交的数据回显到表单中,给出错误消息提示,以便于用户修正数据、再次提交。

    渲染其他动作的视图模板的原因是由于显示表单的动作和处理表单的动作往往不是同一个动作。所以处理表单信息的动作需要以某种方式再次显示原来表单的那个视图模板。如:

class ArticlesController < ApplicationController

  def index

    @articles = Article.all

  end

  def new

    @article = Article.new

  end

  def create

    @article = Article.new(params[:article])

    if @article.save

      redirect_to articles_path

    else

      render :new

    end

  end 

end 渲染一个完全不同的模板:    可以通过 :template或者 :file 参数在一个动作中渲染任意指定的模板文件。

    :template 参数指定一个模板根目录的相对路径,默认是 app/views (可以修改)

    如:render :template => “abuse/report”

          app/views/abuse/report.rhtml    :file 参数接收一个文件的绝对路径。

    如:render :file => “/railsapps/myweb/app/views/templates/common.rhtml” 渲染局部模板:    渲染视图可以渲染局部模板(通常简称为“局部渲染”),使用局部模板可以将你的模板分割成小文件,更加清晰,局部模板也可以被复用。    在控制器中渲染局部模板一般被AJAX调用控制器中的动作的请求,并更新页面上指定的一个区域,另外还可以在视图层中嵌入局部模板如:

render :partial => “location” 局部模板的命名规则必须在最前面加上一个下划线,并将其保存在一个视图模板文件夹内,在引用的时候不需要下划线。 渲染内联模板代码:(不建议使用)    有时候你需要把一段非常小的视图代码发给浏览器(主要用户AJAX视图辅助该当)

    render :inline => “<%= auto_complate_result(@headings, ‘‘name’’) %>”  Rails处理内联视图代码的方式和处理视图模板完全一致。 渲染其他数据类型:  1. :text    有时候动作只需要给浏览器返回一段简单的文本,可以使用

    render :text => “Submission accepted”

    直接渲染、返回一段文本。  2. :json    JSON是专门提供给JavaScript使用的轻量级数据结构,通常是将AJAX请求的响应值通过这种模式返回。

    render :json => @record.to_json  3. :xml

    render :xml => @record.to_xml 什么都不渲染:    很少的情况下动作不想渲染任何东西(为了避免在Safari出现BUG,不渲染任何东西意味着发送一个空字符串给浏览器)

    render :nothing => true, :status => 401    #未授权的渲染的属性:    在使用render方法时,它可以接受一些额外的属性  1. :content_type

    在WEB上的东西都属于MIME规定的类型,如果HTML内容的类型为text/html。在Rails中可以发送其它类型的内容,但Rails并不验证你实际发送的内容是否是你用 :content_type 指定的类型,所以需要我们自己保证一致性。  2. :layout

    默认情况下,Rails会自动选择其需要渲染的布局模板返回给浏览器。使用 :layout 可以指定是否需要布局模板以及使用哪个布局模板。  3. :status

    HTTP协议中宣言很多种状态码以用来标识返回给客户端的内容状态,Rails在大多数情况下都可以按照自己的状态选择合适的状态码,如200OK代表一次请求处理成功。