侧边栏壁纸
博主头像
极客日记 博主等级

行动起来,活在当下

  • 累计撰写 93 篇文章
  • 累计创建 17 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

【Ruby on Rails】View 视图

Jack.Jia
2022-03-27 / 0 评论 / 0 点赞 / 4 阅读 / 0 字

View 的基本概念和用法

View 在 MVC 中, 一直是最简单的概念. 大家要分分钟入门.

视图在 Rails 中, 就是.html.erb 文件. 我们原则上把跟 HTML 有关的东西, 都写在视图中。

每个视图都要由 controller 触发. 所有的视图文件, 都放在: app/views/ 目录下. 例如: app/views/books/new.html.erb 这是 Rails 的约定。

最基本用法

下面是一个最简单的 erb 文件:

<p>当前时间是:  <%= Time.now %></p>

它会直接被转换成下面的 HTML:

<p>当前时间: 2016-10-08 21:01:35 +0800</p>

<% %> 与 <%= %> 的区别

<% %> 表示仅运行代码, 例如: <% a = 1 %>
<%= %> 表示, 不但运行, 而且把结果渲染到 html 中. 例如: <%= Time.now %>

Rails 中的视图在什么时候被渲染?

用一个例子来说明, view 在哪里建立, 在什么时候渲染:

  1. 小王同学在浏览器端,输入了一个网址: https://www.explorexd.com ,回车。(这会产生一个 “http request” , 请求方式是 GET)

  2. “http request” 从浏览器,发送到服务器端 (www.explorexd.com) 之后, Rails 就会 把这个请求交给 router 来处理。

  3. router 根据配置文件: config/routes.rb 中的配置:

    Rails.application.routes.draw do
    resources :fruits # 根据这个路由配置
    end
    

    把这个 request,分发到: fruits controller 中的 new action

  4. new action 做一些 处理, 显示对应的 erb

# 下面是 app/controllers/fruits_controller.rb 的内容:
class FruitsController < ApplicationController
  def new
    @hello = 'hellow, Rails!'
    # 啥也不写,就直接渲染对应的 erb页面:
    #  app/views/fruits/new.html.erb
  end
end

上面的 new action 执行完, 会自动渲染 new.html.erb 这个文件 ( 文件路径: app/views/books/new.html.erb )

<% [1,2,3].each do e %>
  <%= e %> <br/>
<% end %>

上面的视图文件会被渲染成:

1 <br/> 2<br/> 3<br/>

基本概念讲完了, 就是这么简单.

恰当的使用 @变量

大家记得, 任何实例变量 (@name 这样的), 都用于定义在 controller 中, 然后在 view 中被调用.

Partial (片段)

有时候,如果某个 erb 文件, 过于复杂了。 例如: 20 行。
或者, 某些代码可以重用。
我们就用 Partial 来简化我们的代码, 提取出公共的部分.
不带参数的 partial
例如:

<!-- 下面这段是版权声明,多个页面都需要重用  -->
<footer>
  copyright@2016 xx.co.ltd
</footer>

那么就把它写成一个 partial ( 片段)

全名是: app/views/fruits/_footer.html.erb(注意,文件名以 “_“开头)

然后,我们就可以在对应的 erb 文件中:

<%= render :partial => 'footer' %>

注意: 上面的调用中, 直接使用了 'footer', 而不是 _footer.html.erb。这也是 Rails 的惯例.

带参数的 partial

如果,某个 partial , 是需要参数的,(例如: 年份是个变量)

<!-- 下面这段是版权声明,多个页面都需要重用  -->
<footer>
  copyright@ <%= year %>xx.co.ltd
</footer>

那么,在调用时,就:

<%= render :partial => 'footer', :locals => {:year => 2016} %>

可以看到, 使用了 locals 来传递参数.

不要使用嵌套层次过多的 partial

例如 partial A 嵌套 partial B , partial B 嵌套 partial C. 一旦发展下去, 你就会发现自己的代码乱套了。

partial 失去了它简化代码的作用。

helper 的用法

helper 的目的是为了让 view 的代码看起来更简化.

它是一个 ruby module, 可以定义在 app/helpers 目录下的任何文件中. 例如:

# app/helpers/application_helper.rb
module ApplicationHelper
end
添加一个helper
module ApplicationHelper
  def say_hi name
    "hi #{name}"
  end
end

那么我就可以在 任意的 view 中, 使用这个方法:

<%= say_hi "Jim" %>

我在任意的页面中, 可以调用定义在任意 helper 中的方法. 例如:

# app/helpers/foo_helper.rb
module FooHelper
  def say_hi
    "hi"
  end
end

不要过多的使用 helper

因为我们调用 helper 的时候, 不会显示的写出 caller. 例如:

# my_module 就是 say_hi 的caller
my_module.say_hi

# 下面,没有一个显式的caller, 那么,我们就不知道这个find_me方法定义在哪里.
find_me
0

评论区