rails布局和视图
2018-03-25 本文已影响81人
李傲娢
渲染顺序以及继承
渲染页面的时候使用模版
在rails中可以通过指定layout的方式设置不同的控制器使用的布局文件.如果没有明确指定那么框架会首选在layout文件夹下查找和当前控制器同名的文件是否存在,如果不存在会默认使用application.html.erb
渲染视图
在做视图渲染的时候,会根据action的名字在对应的views目录中查找action.html.erb,可以通过为render方法指定参数的形式设置渲染的视图文件,如
def update
@user = User.find(params[:id])
if @user.update(user_params)
redirect_to(@book)
else
render 'edit'
end
end
如果调用 update 失败,update 动作会渲染同个控制器中的 edit.html.erb 模板.
如果要渲染其他控制器中的某一个action模版,可以通过指定render的参数为:'controller_name/action_name'的方式实现.如:
render 'user/login' # 渲染 app/views/user/login.html.erb
防止多次渲染
在render的时候如果一个action中有多个render会引起错误,建议使用 and return解决.如:
def show
@user = User.find(params[:id])
if @user.blank?
render text: '用户信息不存在' and return
end
render json: @user
end
重定向
redirect_to重定向到指定的地址
redirect_back返回前一个页面
render和redirect的区别,render只会渲染视图不会执行相关action中的方法,redirect_to会执行一个新的页面跳转.
视图渲染
yield表明一个区域,渲染的视图会插入这里.可以通过命名的方式插入指定的区域,此方式需要结合content_for使用.
<!-- 布局代码 -->
<html>
<head>
<%= yield :head %>
</head>
<body>
<%= yield %>
</body>
</html>
<!-- 页面view -->
<% content_for :head do %>
<title>我是标题</title>
<% end %>
<h5>插入页面中的内容</h5>
<p>这些内容会插入在body中</p>
局部视图
为了便于视图文件的重复利用和把大页面进行拆分,可以使用局部视图对页面进行组织.局部视图命名已_开始
渲染局部视图使用render方法:
<%= render 'shared/copyright' %>
<!--
此段代码会引入 app/views/shared/_menu.html.erb这个局部视图文件
-->
可以为局部视图使用局部布局.局部布局也以_开头,放置在局部视图所在的文件夹下.使用局部布局的时候需要为render提供参数时指定属性名,如
<%= render partial: 'copyright', layout: 'footer' %>
使用局部视图的时候可以传递局部变量.如
<!-- new.html.erb -->
<h5>用户新增</h5>
<%= render partial: 'form', locals: {user: @user} %>
<!--_form.html.erb-->
<%= form_for(user) do |f| %>
<div class="form-group">
<label>用户名</label>
<%= f.text_filed :name %>
</div>
<% end %>