为完整的堆栈网络应用构建后端
#javascript #react #ruby #rails

我使用React和Rails进行了第二个完整的堆栈项目。这是一段旅程。我对React,HTML,CSS,JavaScript进行了对前端的知识。对于后端,我利用了Ruby在Rails上的新知识。今天,我们将专注于后端。

在此旅程中,我了解了铁轨的基本面,带有导轨,验证,错误处理,主动记录协会,序列化,授权和身份验证的CRUD。

哇。好多啊。在这篇博客文章中,我将介绍我为创建完整的堆栈网络应用程序的后端所采取的每一步。 Ela Ela是一个虚拟空间,学生可以在其中阅读,评论和发表有关英语语言艺术(ELA)主题的文章。这是我虚拟学校的学生的网站。学生能够注册,登录,创建帖子,阅读帖子和注销。可以创建,阅读,更新和删除评论。

首先,我确保我有Ruby 2.7.4,Nodejs(V16)和NPM设置。我克隆了一个项目模板存储库,并在GitHub上创建了一个新的远程存储库。我运行捆绑包,Rails DB:创建和NPM安装。

那时,我都设置了!这是乐趣开始的地方。

模型
我创建了三个模型:学生,评论和帖子及其桌子。

create_table "comments", force: :cascade do |t|
    t.string "body"
    t.integer "post_id"
    t.integer "student_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end
create_table "posts", force: :cascade do |t|
    t.string "title"
    t.string "image"
    t.string "body"
    t.integer "student_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end
create_table "students", force: :cascade do |t|
    t.string "username"
    t.string "password_digest"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

我知道我需要积极的记录协会,所以我计划了。

class Comment < ApplicationRecord
  belongs_to :student
  belongs_to :post
end
class Post < ApplicationRecord
  has_many :comments
  has_many :students, through: :comments
end
class Student < ApplicationRecord
  has_many :comments
  has_many :posts, through: :comments
end

控制器
然后,我使用Rails G命令创建控制器。我知道我想要评论的完整功能,为学生和帖子创建和阅读功能,并且我需要一个SessionsController来登录和注销功能。创建控制器后,我在控制器中设置了这些方法。

class CommentsController < ApplicationController

    def index

    end

    def create

    end

    def update

    end

    def destroy

    end

end
class PostsController < ApplicationController
    def index

    end

    def show

    end

    def create

    end

end
class SessionsController < ApplicationController

    def create

    end 

    def destroy

    end

end
class StudentsController < ApplicationController

    def show

    end

    def create

    end

end

导轨路由
在config/doutes.rb文件中,我创建了路由。

resources :comments
  resources :posts, only: [:index, :show, :create]
  post "/signup", to: "students#create"
  get "/me", to: "students#show"
  post "/login", to: "sessions#create"
  delete "/logout", to: "sessions#destroy"

验证
现在,进行验证。验证是特殊方法调用由执行保护数据库免受无效数据的工作的代码组成。

例如,我想确保所有评论都超过1个字符,帖子具有标题,并且学生具有独特的用户名。

class Comment < ApplicationRecord
    validates :body, length: { minimum: 1 }

    belongs_to :student
    belongs_to :post
end
class Post < ApplicationRecord
    validates :title, presence: true

    has_many :comments
    has_many :students, through: :comments
end
class Student < ApplicationRecord

    has_many :comments, dependent: :destroy
    has_many :posts, through: :comments

    validates :username, presence: true, uniqueness: true
end

错误处理
然后,我更新了控制器的操作,以检查我们的模型的有效性,并适当响应:

class ApplicationController < ActionController::API
    include ActionController::Cookies

    rescue_from ActiveRecord::RecordInvalid, with: :render_unprocessable_entity_response
    rescue_from ActiveRecord::RecordNotFound, with: :render_not_found_response

    def render_unprocessable_entity_response(e)
        render json: {errors: e.record.errors.full_messages}, status: :unprocessable_entity
    end

    def render_not_found_response(invalid)
        render json: { errors: invalid }, status: :not_found
    end

end

序列化
序列化是将数据结构或对象转换为可以存储或传输和重建的格式的过程。我们需要向API消费者发送标准化响应,以了解传输的数据。我们需要主动模型序列化来构建我们适当地发送回客户端的数据。 (在这种情况下,JSON。)

我使用终端中的rails g命令创建了序列化器。然后,我添加了所需属性和必要的活动记录关联。

class CommentSerializer < ActiveModel::Serializer
  attributes :id, :body

  has_one :student
end
class PostSerializer < ActiveModel::Serializer
 attributes :id, :title, :image, :body, :student_id
end
class PostWithCommentsSerializer < ActiveModel::Serializer
  attributes :id, :title, :body

  has_many :comments
end
class StudentSerializer < ActiveModel::Serializer
  attributes :id, :username
end

身份验证
身份验证是我们的应用程序如何确认我们的用户是他们说的。简而言之,我们使用用户名和密码来验证用户。 (在我们的情况下,学生。)

class SessionsController < ApplicationController

    skip_before_action :authorize, only: :create

    def create
        student = Student.find_by(username: params[:username])

        if student&.authenticate(params[:password])
            session[:student_id] = student.id
            render json: student, status: :created
        else 
            render json: {errors: ["Invalid username or password"] }, status: :unauthorized
        end 
    end 

    def destroy
        session.delete :student_id
        head :no_content
    end

end

授权
授权允许某些用户许可访问特定资源。为了授权学生采取特定的行动,我们可以使用:sudenta_id保存在会话哈希中。我们可以使用tore_action滤波器运行一些代码,这些代码将在会话中检查:susident_id,并且仅授权学生在登录时运行这些操作。

就是这样!我使用Rails基本面,带有导轨的CRUD,验证,错误处理,主动记录关联,序列化,授权和身份验证来构建我的Web应用程序的后端。