在 MVC 架构中**控制器的作用是处理请求(request),但经常会把繁重的操作交给模型完成。返回响应(response)时,控制器会把一些操作交给视图完成。
本文要说明的就是控制器交给视图的操作是怎么完成的。
Rails的视图渲染看上去浑然天成——基于“多约定,少配置”原则,Rails 会自动在控制器的视图文件夹中寻找 action_name.html.erb
模板,然后渲染。
另外,Rails还为我们提供了三种创建HTTP响应的方法:
- 调用
render
方法,向浏览器发送一个完整的响应 - 调用
render_to
方法,向浏览器发送一个HTTP重定向状态码 - 调用
head
方法,向浏览器发送只包含报头的响应
使用render方法
- 如果想渲染同个控制器中的其他模板,可以把视图的名字传递给
render
方法:
def update
@book = Book.find(params[:id])
if @book.update(book_params)
redirect_to(@book)
else
render "edit" #### 也可以使用Symbol render :edit
end
- 渲染其他控制器中的动作模板
render "products/show" ## products控制器下的show
- 渲染任意文件
可以渲染任意文件 - 渲染文本
调用 render方法时指定 :plain选项,可以把没有标记语言的纯文本发给浏览器:
render plain: "OK" ##返回纯文本
- 渲染HTML
render html: "<strong>Not Found</strong>".html_safe
- 渲染JSON
render json: @product
在需要渲染的对象上无需调用 to_json方法,如果使用了 :json 选项,render方法会自动调用 to_json。
- 渲染XML
render xml: @product
- 渲染普通的 JavaScript
render js: "alert('Hello Rails');"
- 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
方法渲染时,并不是goto
到index 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协议还不是太清楚。
网友评论