Rails视图渲染

MVC 架构中**控制器的作用是处理请求(request),但经常会把繁重的操作交给模型完成。返回响应(response)时,控制器会把一些操作交给视图完成。

本文要说明的就是控制器交给视图的操作是怎么完成的。

Rails的视图渲染看上去浑然天成——基于“多约定,少配置”原则,Rails 会自动在控制器的视图文件夹中寻找 action_name.html.erb 模板,然后渲染。

另外,Rails还为我们提供了三种创建HTTP响应的方法:

  • 调用render方法,向浏览器发送一个完整的响应
  • 调用render_to方法,向浏览器发送一个HTTP重定向状态码
  • 调用head方法,向浏览器发送只包含报头的响应

使用render方法

  1. 如果想渲染同个控制器中的其他模板,可以把视图的名字传递给 render方法:
def update
  @book = Book.find(params[:id])
  if @book.update(book_params)
    redirect_to(@book)
  else
    render "edit" #### 也可以使用Symbol render :edit
  end
  1. 渲染其他控制器中的动作模板
render "products/show"  ## products控制器下的show
  1. 渲染任意文件
    可以渲染任意文件
  2. 渲染文本
    调用 render方法时指定 :plain选项,可以把没有标记语言的纯文本发给浏览器:
render plain: "OK" ##返回纯文本
  1. 渲染HTML
render html: "Not Found".html_safe
  1. 渲染JSON
render json: @product

在需要渲染的对象上无需调用 to_json方法,如果使用了 :json 选项,render方法会自动调用 to_json。

  1. 渲染XML
render xml: @product
  1. 渲染普通的 JavaScript
render js: "alert('Hello Rails');"
  1. HTTP状态码
render status: 500 / :forbidden

Rails 能理解数字状态码和对应的符号,常见的如下所示:

  • 信息类:
100 => :continue
101 => :switching_protocols
102 => :processing
  • 成功类:
200 => :ok
  • 重定向类:
300  xxxx
  • 客户端类:
400 => :bad_request
403 => :forbidden
404 => :not_found
  • 服务器错误:
500 => :internal_server_error

使用 redirect_to方法

程序执行到 redirect_to方法时,代码会停止运行,等待浏览器发起新请求。你需要告诉浏览器下一个请求是什么,并返回 302 状态码。

例子:

def index
  @books = Book.all
end
 
def show
  @book = Book.find_by(id: params[:id])
  if @book.nil?
    render action: "index"
  end
end

这样做看似没什么不对,但是请注意render方法渲染时,并不是gotoindex action,所以@books变量不存在,我们可以使用redirct_to方法解决:

def index
  @books = Book.all
end
 
def show
  @book = Book.find_by(id: params[:id])
  if @book.nil?
    redirect_to action: :index
  end
end

问题解决了,但是,这样的两次请求会增加响应的时间,如果我们项目中对响应时间有要求的话,我们就得改改了:

def index
  @books = Book.all
end
 
def show
  @book = Book.find_by(id: params[:id])
  if @book.nil?
    @books = Book.all
    flash.now[:alert] = "Your book was not found"
    render "index"
  end
end

调用head方法

先PASS吧,目前,我对HTTP协议还不是太清楚。

你可能感兴趣的:(Rails视图渲染)