使用 rails 实现最简单的 CRUD
创建 rails 项目
以 blog 项目为例:
rails new blog
只需几秒钟就会得到一个基本的 rails 项目结构:
各个目录的作用为:
- app:存放web应用的控制器、视图、模型、helpers等,开发主要集中在这里
- bin*:各种脚本
- config:路由、数据库等的配置文件
- db:数据库的schema和数据库的迁移文件
- log:日志文件
- package.json:npm包记录,使用yarn管理
- public:静态文件
- test:测试
使用 rails server
命令启动服务器即可在本地3000端口访问到服务
替换首页
使用命令生成控制器 hello
rails generate controller hello
rails 自主生成了部分文件:
修改 config/routes.rb
文件配置路由,修改如下:
Rails.application.routes.draw do get "hello/index" root "hello#index" end
这里定义了路由 hello/index,并且使用 root 方法将首页修改为了 hello 控制器下的 index 方法,也就是两路由的控制器一致。
接下来定义控制器:
class HelloController < ApplicationController def index end end
rails足够智能可以自己在视图文件夹寻找名为 index.html.erb
的视图文件,将视图文件写入以下内容
<h1>hello, rails</h1>
此时,浏览器中打开 /
和 /hello/index/
路径都将返回同样的内容
文章的增加
使用以下生成数据库模型:
rails generate model Article title:string content:text
使用以下迁移数据库:
rails db:migrate
使用以下命令生成控制器:
rails generate controller Articles
配置 articles 的路由:
resources :articles
使用 rails routes
命令查看当前的路由配置:
很明显,从这里可以看到每个路由应该对应的控制器方法,这是一个典型的RESTful api的配置。
按照上文中的方法创建好 new.html.erb
文件和 new
方法,在 new.html.erb
文件中写入:
<h2>new article</h2> <%= form_with(scope: :article, url: articles_path, local: true) do |form| %> <p> <%= form.label :title %> <br> <%= form.text_field :title %> </p> <p> <%= form.label :content %> <br> <%= form.text_area :content %> </p> <%= form.submit %> <% end %>
form_with
方法默认是提交到当前路由,通过url字段将其定义为post到 /articles
路径。
此时访问 /articles/new
路径可以看到表单:
此时我们需要定义提交之后的处理路径,从上面的路由配置中我们可以知道对应于 create
方法
def create @article = Article.new(article_params) @article.save redirect_to @article end
此时提交表单,可以看到报错:
于是我们定义show方法:
def show @article = Article.find(params[:id]) end
定义相应的视图文件 show.html.erb
:
<h2>Show article</h2> <p> title: <br> <%= @article.title %> </p> <p> content: <br> <%= @article.content %> </p>
此时提交表单则直接跳转到show视图定义:
文章的列举
我们利用 index
action 列举所有的 article,定义 index
方法
def index @article = Article.all end
定义视图:
<h2>List all Articles </h2> <%= link_to "new article", new_article_path %> <% @article.each do |a| %> <p> title: <br> <%= a.title %> </p> <p> content: <br> <%= a.content %> </p> <% end %>
此时访问 /articles
路径可以看到
文章更新
通过路由配置更新分别对应于edit和update两个action,定义edit方法:
def edit @article = Article.find(params[:id]) end
定义相应的视图文件:
<h2>Edit article</h2>
<%= form_with(model: @article, local: true) do |form| %>
<p>
<%= form.label :title %> <br>
<%= form.text_field :title %>
</p>
<p>
<%= form.label :content %> <br>
<%= form.text_area :content %>
</p>
<%= form.submit %>
<% end %>
定义update方法:
def update @article = Article.find(params[:id]) @article.update article_params redirect_to @article end
此时可以发现已经可以正常更新了。
删除文章
首先在文章列表页声明删除文件的链接,修改为:
<h2>List all Articles </h2> <%= link_to "new article", new_article_path %> <% @article.each do |a| %> <p> title: <br> <%= a.title %> </p> <p> content: <br> <%= a.content %> </p> <p> <%= link_to "edit", edit_article_path(a) %> <br> <%= link_to "delete", article_path(a), method: :delete %> </p> <% end %>
定义 destroy 方法:
def destroy @article = Article.find(params[:id]) @article.destroy redirect_to articles_path end
此时已经可以删除文件了。
数据验证
将 model 文件夹下的 article.rb 文件修改为
class Article < ApplicationRecord validates :title, presence: true, length: {minimum: 5} validates :content, presence: true end
将 new 对应的视图文件修改为:
<h2>new article</h2> <%= form_with(model: @article, url: articles_path, local: true) do |form| %> <% if @article.errors.any? %> <div> <%= @article.errors.count.to_s%> erors </div> <% end %> <p> <%= form.label :title %> <br> <%= form.text_field :title %> </p> <p> <%= form.label :content %> <br> <%= form.text_area :content %> </p> <%= form.submit %> <% end %>
将控制器的 new action 修改为:
def new @article=Article.new end
create action 修改为:
def create @article = Article.new(article_params) if @article.save redirect_to @article else render 'new' end end
此时,一个简单的带数据验证的 crud 就实现了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: Active Record 基础
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论