使用 rails 实现最简单的 CRUD

发布于 2022-08-23 12:48:16 字数 10775 浏览 173 评论 0

创建 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

清风无影

暂无简介

文章
评论
25 人气
更多

推荐作者

微信用户

文章 0 评论 0

小情绪

文章 0 评论 0

ゞ记忆︶ㄣ

文章 0 评论 0

笨死的猪

文章 0 评论 0

彭明超

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文