ActionView: actionview gem
ActionController: actionpack gem
actionview和actionpack都可以单独用于某个项目,rails就是由不同的gem包构成的。
Template: index.html.erb 完整的页面
Partial:_ user.html.erb 部分可共用的模板页面
Layouts: application.html.erb 定义了view的父视图或者布局视图
<% @users.each do |user| %>
<tr>
<td><%= user.id %></td>
<td><%= user.username %></td>
</tr>
<% end -%>
注:这里<% end -%>
,end 后追加一个减号,可以减少多余的空白换行输出
2. HAML
3. Builder: json builder, xml builder etc.
都是完成Ruby语法到字符串的解释
index.html.erb
修改action的查找view的行为,组建当前request的response
def search
render text: 'ok'
render json: @users
render xml: @users
render file: 'ạpp/views/users/index'
render partial: 'app/ views/users/search'
end
注:一个action 只能使用一次render或redirect_to
渲染和解释子视图(sub-view)
<%= render "shared/ menu" %>
<%= render partial: "shared/menu" %>
<%= render "shared/ menu", locals: {var_1: 'value_1'} %>
两种方式效果相同
<% @users.each do |user| %>
<%= render partial: "one_user", locals: {user: user} %>
<% end -%>
<%= render partial: "one_user", collection: @users, as: 'user' %>
as: ‘user’ 是因为你的模板中需要的变量是user.id 和user.username
在所有的sub_view 子模板中,都能够访问当前view 或action的所有实例变量
调用 render 方法时指定 :plain 选项,可以把没有标记语言的纯文本发给浏览器:
render plain: "OK"
JSON 是一种 JavaScript 数据格式,很多 Ajax 库都用这种格式。Rails 内建支持把对象转换成 JSON,经渲染后再发送给浏览器。
在需要渲染的对象上无需调用 to_json 方法。如果有 :json 选项,render 方法会自动调用 to_json。
Rails 也内建支持把对象转换成 XML,经渲染后再发给调用方
Rails 能渲染普通的 JavaScript:
render js: "alert('Hello Rails');"
render 方法一般可接受五个选项:
根据当前请求决定使用哪个布局:
class ProductsController < ApplicationController
layout :products_layout
private
def products_layout
@current_user.special? ? "special" : "products"
end
end
2.2.13.3 根据条件设定布局
在控制器中指定布局时可以使用 :only 和 :except 选项。这两个选项的值可以是一个方法名或者一个方法名数组,对应于控制器中的动作
class ProductsController < ApplicationController
layout "product", except: [:index, :rss]
end
2.2.13.5 模板继承
与布局的继承逻辑一样,如果在约定的路径上找不到模板或局部视图,控制器会在继承链中查找模板或局部视图。因此,app/views/application/ 最适合放置共用的局部视图,
2.2.14 避免双重渲染错误
Can only render or redirect once per action
解决的办法很简单,确保在一次代码运行路径中只调用一次 render 或 redirect_to 方法。有一个语句可以帮助解决这个问题,那就是 and return。
render action: "special_show" and return
你可以使用 redirect_back 把用户带回他们之前所在的页面。前一个页面的地址从 HTTP_REFERER 首部中获取,浏览器不一定会设定,因此必须提供 fallback_location
redirect_back(fallback_location: root_path)
head 方法只把首部发送给浏览器,它的参数是 HTTP 状态码数字或符号形式(参见前面的表格),选项是一个散列,指定首部的名称和对应的值。例如,可以只返回一个错误首部:
head :bad_request
Rails 提供了六个静态资源标签辅助方法:
auto_discovery_link_tag
javascript_include_tag
stylesheet_link_tag
image_tag
video_tag
audio_tag
在布局中,yield 标明一个区域,渲染的视图会插入这里。(??)
content_for 方法还可以在通用布局中引入特定页面使用的 JavaScript 或 CSS 文件。
<%= render partial: "link_area", layout: "graybar" %>
locals:
或local_assigns
可以将局部变量可以传入局部视图。<%= render partial: "customer", object: @new_customer %>
<%= render @customer %>
假设实例变量 @customer 的值为 Customer 模型的实例,上述代码会渲染 _customer.html.erb,其中局部变量 customer 的值为父级视图中 @customer 实例变量的值。