使用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 的视图文件,将视图文件写入以下内容

hello, rails

此时,浏览器中打开 //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 文件中写入:

new article

<%= form_with(scope: :article, url: articles_path, local: true) do |form| %>

<%= form.label :title %>
<%= form.text_field :title %>

<%= form.label :content %>
<%= form.text_area :content %>

<%= 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 :

Show article

title:
<%= @article.title %>

content:
<%= @article.content %>

此时提交表单则直接跳转到show视图定义:

文章的列举

我们利用 index action 列举所有的article,定义 index 方法

    def index
        @article = Article.all
    end

定义视图:

List all Articles

<%= link_to "new article", new_article_path %> <% @article.each do |a| %>

title:
<%= a.title %>

content:
<%= a.content %>

<% end %>

此时访问 /articles 路径可以看到

文章更新

通过路由配置更新分别对应于edit和update两个action,定义edit方法:

    def edit
        @article = Article.find(params[:id])
    end

定义相应的视图文件:

Edit article

<%= form_with(model: @article, local: true) do |form| %>

<%= form.label :title %>
<%= form.text_field :title %>

<%= form.label :content %>
<%= form.text_area :content %>

<%= form.submit %> <% end %>

定义update方法:

    def update
        @article = Article.find(params[:id])

        @article.update article_params

        redirect_to @article
    end

此时可以发现已经可以正常更新了。

删除文章

首先在文章列表页声明删除文件的链接,修改为:

List all Articles

<%= link_to "new article", new_article_path %> <% @article.each do |a| %>

title:
<%= a.title %>

content:
<%= a.content %>

<%= link_to "edit", edit_article_path(a) %>
<%= link_to "delete", article_path(a), method: :delete %>

<% 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对应的视图文件修改为:

new article

<%= form_with(model: @article, url: articles_path, local: true) do |form| %> <% if @article.errors.any? %>
<%= @article.errors.count.to_s%> erors
<% end %>

<%= form.label :title %>
<%= form.text_field :title %>

<%= form.label :content %>
<%= form.text_area :content %>

<%= 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就实现了。

你可能感兴趣的:(使用rails实现最简单的CRUD)