专栏首页忽如寄的前端周刊使用rails实现最简单的CRUD

使用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就实现了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Rails布局和视图渲染

    基于“多约定,少配置”原则,在 index 动作末尾并没有指定要渲染的视图,Rails会自动在控制器的视图文件夹中寻找 action_name.html.erb...

    用户1515472
  • 关于Babel 6的 loose mode

    loose mode 我翻译为松散模式,loose mode在babel中通常是不推荐使用的,但是我们需要知道的是使用 loose mode 转换而来的代码更加...

    用户1515472
  • 使用react-router4.0实现重定向和404功能

    在使用react开发中,重定向和404这种需求非常常见,使用React-router4.0可以使用Redirect进行重定向 最常用的就是用户登录之后自动跳转...

    用户1515472
  • Spring Boot 实战|RESTful API 构建示例

    权限管理是所有后台系统的都会涉及的一个重要组成部分,主要目的是对不同的人访问资源进行权限的控制,避免因权限控制缺失或操作不当引发的风险问题,如操作错误,隐私数据...

    南风
  • Spring Boot实战:Restful API的构建

    用户2140019
  • Spring Boot实战:Restful API的构建

    用户2140019
  • MyBatis + MySQL返回插入成功后的主键id

    这是最近在实现perfect-ssm中的一个功能时碰到的一个小问题,觉得需要记录一下,向MySQL数据库中插入一条记录后,需要获取此条记录的id值,以生成对应的...

    我是十三
  • ECAI 2016论文精选 | 更快,更精确的人脸识别方法

    导读:ECAI 2016是欧洲展示AI科学成果的最佳场所,大会为研究人员提供了很好的机会,去介绍和听取当代最优秀的人工智能研究成果。 人脸识别的随机典型相关判别...

    AI科技评论
  • 共旋坐标法( 三 ) 算例

    为计算方便,根据对称性取半结构,且刻意将初始刚度设为1,便于观察。取半结构之后,自由度只有一个,用Excel也能算了。当外荷载较小时,不会出现“跳跃”...

    fem178
  • RTOS内功修炼记(八)— CMSIS RTOS API,内核通用API接口

    CMSIS-RTOS API是ARM公司为RTOS内核制定的一套通用接口协议,它提供了一套「标准的API接口」,可以移植到各种各样的RTOS上,使得上层的软件、...

    Mculover666

扫码关注云+社区

领取腾讯云代金券