我使用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应用程序的后端。