对于前端页面而言,有好多方法可以简化页面,下面介绍的集中方式就是来简化页面

template: 涉及到的前端模板包括erb, json, xml, aton

partials: 对反复使用的view可以提取出来,放置在任何需要重复使用的地方。类似的方法包括render, provide, capture

layouts: 这是用来指定view的布局文件。涉及到的方法包括

layout, yield, content_for, content_for?

常用template的介绍和使用

安装

#erb模板,*.html.erb
html.erb

#xml模板, *.xml.builder
gem 'builder' #rails中gemfile.lock默认安装

#json模板, *.json.jbuilder
gem 'jbuilder' #rails中gemfile默认安装

#atom_feed, *.atom.builder

使用

#指定模板类型,其他没有指定的模板会报错
class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
    respond_to do |format|
      format.html
      format.xml { render xml: @users} #{}内容可以省略
      format.json { render json: @users} #{}内容可以省略
    end
  end
end

#使用xml显示:show.xml.builder
xml.div {
  xml.h1(@user.name)
  xml.p(@user.address)
}

#使用json显示,_user.json.jbuilder.
json.extract! user, :id, :name, :address, :created_at, :updated_at
json.url user_url(user, format: :json)

#使用rss的例子,参考rails api的atom_feed方法

partials中的render方法使用

#使用实例
/app/views/users/中存在show.html.erb和_user.html.erb两个文件
#show.html.erb的代码如下
<%= render 'user' %>

#view一般使用,区别于controller中的render方法使用
<%= render 'user' %>  #会使用该代码所处文件的文件夹的_user.html.erb文件,render 'user'没有下划线,但是文件名有下划线
<%= render 'shared/user' %> #指定shared文件夹下面的文件_user.html.erb作为partial文件,而前者默认为同一文件夹下面

#添加可选参数,指定partial中局部变量的值
<%= render partial: 'user', locals: {user: @user} %> #前一个user是partial中将要使用的变量,后一个为action传递过来的@user
<%= render 'user', { user: @user } %> 是上面指定局部变量的缩写形式

#若没有指定locals,则默认partial使用从controller中传递过来的变量
<%= render 'user' %> #默认使用从controller中传递过来的@user

#若指定了locals,必须添加partial的形式
<%= render 'user', locals: {user: @user} %> #无效,因为添加了locals
<%= render partial: 'user', locals: {user: @user} %> #有效,locals必须有partial
<%= render partial: 'user', user: @user %> #有效,是简写形式,没有显示写明是locals

#参考上面例子,默认从contrller传递过来是@user,如果controller中传递过来的不是@user,则可以做如下简便写法
#从controller传递过来的是@demo
<%= render partial: 'user', locals: {user: @demo} %>
<%= render partial: 'user', object: @demo %> #使用object作为简写形式,默认partial中使用的是user

#默认传递到partial中的是user变量,如果要变为demo变量,可以做如下简便写法
<%= render partial: 'user', locals: {demo: @user} %>
<%= render partial: 'user', object: @user, as: "demo" %> #简便写法,但是object不能缺少

#显示集合的简便写法
#写法1
<% @users.each do |user| %>
  <%= render partial: "user", locals: { user: user } %>
<% end %>
#写法2
<%= render partial: "user", collection: @users %>
#写法3
<%= render @users %>

#render没有内容的解决方案
<%= render(@users) || "There are no users available." %>

#render中使用layout
<%= render @products, layout: false %>

#使用spacer template,在每一个_user.html.erb中间会嵌入页面,但是实际上都是出现在页首,不是单独的中间
<%= render partial: @users, spacer_template: "user_demo" %>

#一个页面不能被同时render两次,解决方案如下
def show
  @book = Book.find(params[:id])
  if @book.special?
    #render action: "special_show" && return #因为比较级原因该语句会出错
    render action: "special_show" and return
  end
  render action: "regular_show"
end
#承接上面的内容,渲染集合的过程中,集合的名称可以随意,但是局部视图中的变量必须和文件名称相同
<%= render @users %> #这里是@users,也可以是@articles,取决于controller中传递过来 值

#局部变量必须和局部变量所在的文件名相同,文件名为_user.html.erb,文件内容必须为
<p>user name: <%= user.name %></p>

layouts的使用

使用layouts布局

#没有指定layout的情况下,默认使用application.html.erb布局,在app/views/layouts

#指定布局的情况,需要在app/views/layouts中添加相应布局文件,例如main.html.erb文件
class UsersController < ApplicationController
  layout 'main'
end

#布局指定特定的action
class UsersController < ApplicationController
  layout 'main', only: [:index, :show]
  layout "main", except: [:index, :show]
end

#使用方法判断布局文件
class UsersController < ApplicationController
  layout :users_layout

  private
    def users_layout
      @user.special? ? "minor" : "main"
    end
end

#在render中使用布局
render 'user', layout 'main'

#根据请求方法使用布局
class UsersController < ApplicationController
  layout Proc.new { |controller| controller.request.xhr? ? "main" : "application" }
end

results matching ""

    No results matching ""