Rails是一个MVC模型

开发一个Hello Rails的步骤:

  • 写一个控制器
  • 写一个视图
  • 设置一条路径连接他们两个

不需要写模型,因为不需要处理任何数据。

一条命令创建控制器

前面的文章中说到,一条命令即可新建一个Rails程序
rails new xxx
同理,一条命令即可新建一个控制器:
rails generate controller
如:
rails generate controller Say hello goodbye

做了下面的这些事情:

      create  app/controllers/say_controller.rbroute  get 'say/goodbye'route  get 'say/hello'invoke  erbcreate    app/views/saycreate    app/views/say/hello.html.erbcreate    app/views/say/goodbye.html.erbinvoke  test_unitcreate    test/controllers/say_controller_test.rbinvoke  helpercreate    app/helpers/say_helper.rbinvoke    test_unitinvoke  assetsinvoke    coffeecreate      app/assets/javascripts/say.coffeeinvoke    scsscreate      app/assets/stylesheets/say.scss

就目前的体验来说,Rails框架帮我们做了好多事情啊。

理解Rails处理请求的方式(类比.net的路由分发机制)

仍然需要明确的是:

一个Rails程序,在用户看来要与一个URL相关联。当你把浏览器指向这个URL时,你就像开始与这个应用程序代码进行对话一样,应用程序负责生成应答信息。

上面创建Controller时,

还根据控制器的名字创建了一个视图文件夹,在这个视图文件夹下,根据控制器的方法生成了对应的页面。

动态网页设计(信息传递)

一般来说动态内容通过代码控制,在Rails中,这种代码就是Ruby代码。SSH中就是Java代码,.net中就是C#代码。大致两种方法:1)前端代码中夹杂着后端代码;2)通过路由引用后端代码。

ERB方式

将模板文件命名为xxx.html.erb,这将告诉Rails,借助ERB系统对文件内容进行扩展。

ERB是一个过滤器,输入的是.erb文件,输出的是转换后的内容。
普通前端内容不会被改变,只有在<%= %>之间的内容才会被转化。
比如:

<p>现在是 <%= Time.now%>
</p>

每次刷新浏览器,就可以看到时间更新了。

这种机制基本上是通用的,只是在语法上有一点点细节的不同。

开发与生产环境的不同

我们在开发测试时,没有重新rails s这样,直接在浏览器刷新就可以看到更新后的内容,这实际上是Rails为开发环境提供的便利,生产环境下不是这样的。

因为这种灵活性的代价是:在用户输入URL和程序作出响应之间造成一个短暂的间隔。

上面这种把代码写在.erb文件中虽然灵活,但是违背了关注点分离的原则。前端老老实实负责界面就好,动态的内容,逻辑等交给控制器来做就好。

即:

  • “获得时间”的方法放在控制器
  • 视图只承担显示信息的作用

时间信息是一份数据,应该由控制器提供给视图。

在控制器中:

class SayController < ApplicationController #继承自此控制器def hello@time = Time.nowenddef goodbyeend
end

在视图中:

<h1>Hello Rails!</h1>
<p>现在是 <%= @time %>
</p>

这种变量直接传递过来好方便啊!在.net中还需要用ViewBag等方式传递。

从这个小demo中看到的是,在控制器类中的实例变量直接在视图中即可引用。

注意这里在视图中仍然引用了Ruby代码,因为只是一个时间变量,看不出来分离关注点了。实际上我们可以对Time对象进行其他的处理,视图只管用即可,越复杂的逻辑,越能看出这种设计的强大。

总结访问过程:

  • 用户通过浏览器进入应用程序:localhost:3000/say/hello
  • Rails把URL分为两个部分,对其分析进行路由模式匹配:say是控制器名称,Rails会为SayController这个Ruby类,位于(app/controllers/say_controller.rb文件)新建一个实例。
  • URL路径的下一部分hello被视为行为名称。Rails调用控制器中的hello方法,该方法新建一个Time对象,保存当前的时间。并将其放在@time实例变量中。(控制器准备数据)
  • Rails寻找一个用于显示结果的模板,它会在app/views目录中寻找与控制器名称相同的子目录say,然后在该子目录中寻找与行为名称相符合的文件hello.html.erb.
  • Rails借助ERB模板系统对此文件进行处理,执行其中嵌套的Ruby代码,并将控制器提供的值代入进去。
  • Rails处理的结果发送给浏览器,并且结束对这一请求的处理。

这样的一个流程,体现了Rails的基本思想之一:

  • 惯例终于配置原则

访问流程中,行为之间的约束都是通过惯例决定的,并没特意写其他的配置文件。

关于配置文件,个人觉得其实很繁琐且耗费心力。如果能够用惯例来替代一部分配置文件,我们在写作时就能更加专注于功能代码的设计写作。

不得不说这样的过程其实是很爽的。

Web的精髓:页面互联+跳转

  • 超链接方式
<p>Say <a href="/say/goodbye">Goodbye </a>
</p>

这种方式的确可以实现,但是效果不佳。因为:Rails把对URL格式的解读直接写进了代码中,而Rails在未来的版本中完全有可能改变目前的解读方式。

Rails在模板视图中可以使用的辅助方法

  • link_to函数

学到这里,可以类比.net的是Razor视图下的辅助方法的使用。

<p>Time to Say <%= link_to "Goodbye", say_goodbye_path%>
</p>

通过link_to来构造一个超链接:第一个参数是显示的文字,第二个参数是告诉Rails,超链接指向goodbye这个动作。

这里有个细节,两个参数并未包含在括号中,好像它们不是link_to()函数的参数一样,实际上这也是Ruby的松散之处(优),若一板一眼写出来(用括号):

<p>Time to Say <%= link_to("Goodbye", say_goodbye_path)%>
</p>

自然也是可以的。

say_goodbye_path这种命名方式也是Rails知道的,等价于/say/goodbye路径。也是惯例重于配置的一个方面。

Rails提供对在应用程序中用到的所有路径命名的能力

–笔记自《Agile Web Development with Rails》

Hello Rails相关推荐

  1. 诗歌rails之如何写一个简单的Rails Plugin

    生成plugin骨架代码: Ruby代码 ruby script\generate plugin MyPlugin ruby script\generate plugin MyPlugin 功能需求: ...

  2. 我的Rails笔记(1)

    <Agile Web Development With Rails>Notebook. 环境: Rails 3.1.0 Gem 1.8.10 Ruby ruby 1.9.2p180 1. ...

  3. [rails] 我的订餐系统 -- 小试ruby on rails(转)

    前言         近期在java社区中一种新的脚本语言ruby,及用ruby开发的一个wab框架 rails也热闹了起来.引起了不少的java开发人员的关注. 本人平时还是很少接触脚本语言方面东东 ...

  4. rails 添加外键_如何在Rails后端中添加功能强大的搜索引擎

    rails 添加外键 by Domenico Angilletta 通过多梅尼科·安吉列塔(Domenico Angilletta) In my experience as a Ruby on Rai ...

  5. ruby on rails_我成为了Ruby on Rails和React的贡献者,你也可以

    ruby on rails I am really grateful to have contributed to a few open source projects, including two ...

  6. 新手安装ruby on rails(ror)的成功必备手册

    2019独角兽企业重金招聘Python工程师标准>>> 如何快速正确的安装 Ruby, Rails 运行环境 每一位使用windows系统来进行ROR开发项目的都是这个世界上折翼的天 ...

  7. rails应用ajax之二:使用rails自身支持

    考虑另一种情况: 1. 页面上半部分显示当前的所有用户,页面下半部分是输入新用户的界面: 2. 每当输入新用户时,页面上半部分会动态更新新加用户的内容: 我们还是用ajax实现,不过这次用rails内 ...

  8. 例题6-2 铁轨(Rails, ACM/ICPC CERC 1997, UVa 514)

    栈应用 例题6-2 铁轨(Rails, ACM/ICPC CERC 1997, UVa 514) 错解 1.每次要把栈清空 2.不能用空的栈(栈顶)去比较 #include<iostream&g ...

  9. nginx rails 详细站点配置入门教程

    Ruby on Rails 是一个用于开发数据库驱动的网络应用程序的完整框架.Rails基于MVC(模型- 视图- 控制器)设计模式.从视图中的Ajax应用,到控制器中的访问请求和反馈,到封装数据库的 ...

  10. Rails 添加新的运行环境

    Rails自带了development.test和production三个environments 我们可以添加Staging database.yml staging: adapter: mysql ...

最新文章

  1. WinXP下At,Schtask和Eventtriggers命令实例(一)
  2. 单元测试如何保证了易用的API
  3. 0.0 目录-深度学习第一课《神经网络与深度学习》-Stanford吴恩达教授
  4. 同步阻塞,同步非阻塞,异步阻塞,异步非阻塞IO
  5. mysql(connector/ODBC)
  6. [UWP]针对UWP程序多语言支持的总结,含RTL
  7. cfiledialog指定位置和大小_GDamp;T | 位置度公差的理解过程
  8. 易语言神经网络验证码识别_递归神经网络 GRU+CTC+CNN 教会验证码识别
  9. 递归应用场景和调用机制
  10. python可以做计量分析吗_技术分享 - python数据分析(2)——数据特征分析(上)...
  11. cms核心功能_如何根据这些重要功能选择合适的CMS
  12. Qt GUI@学习日志
  13. c++: size_type与 size_t一些概念
  14. UPS电源扩展功能一UPS干节点通讯接口扩展板,你了解吗?
  15. 河南省第八届ACM程序设计竞赛(未完再续)
  16. JAVACC使用总结(四):LOOKAHEAD解决语法选择冲突的利刃
  17. Macbook Pro M1(macOS 12.0)读取NTFS移动硬盘方法
  18. 去除黄褐斑的方法,姬净美怎么样
  19. 马王堆汉墓帛书‧老子——乙本释文(德经)
  20. 关于三方支付做的一个小总结,后期不断完善更新

热门文章

  1. LeetCode-9.回文数(大括号+双目运算符使用)
  2. 【ROS学习笔记】(七)服务端Server的实现
  3. QT初探(QT+VS2010)
  4. 人之间的尊重是相互的_人与人之间,尊重很重要
  5. OSG仿真案例(2)
  6. Linux启动nacos成功日志_nacos初体验踩坑与填坑篇
  7. hssfwork 导出excel 文件已损坏_C# NPOI 操作EXCEL文件的读取和导出
  8. java构造反射和函数_反射类的构造函数和方法
  9. djangosave保存数据太慢_PaddlePaddle从入门到炼丹八——模型的保存与使用
  10. vim替换字符串带斜杠_Vim:正则表达式匹配一个字符串