Rails 및 React를 사용하여 JSON API 구축 및 사용
API를 구축하는 "모범 사례"를 이해한 후 다음 질문은 이러한 모든 규칙을 사용하여 API를 구축하는 방법입니다.할 일이 많아 보여요.좋아요.그건 진짜가 아니야!Rails에서는
jsonapi-resources
라는gem을 사용하기 쉽다.이 프로젝트에서 프런트엔드는 React를 사용하여 완료됩니다.Rails의 최신 버전(v.6.0.0)으로서 Rails는 통합된 Webpack(gem처리 Rails+Webpack의 통합)을 가지고 있다.이것은 우리로 하여금 더욱 쉽게 React를 사용할 수 있게 할 것이다.🙌
React를 사용하여 API의 데이터를 사용하는 것은 어렵지 않습니다.그러나 API로 보낼 데이터를 포맷하는 것은 복잡할 수 있습니다.또 다른 도서관이 이렇게 할 수 있다!또한 이 라이브러리는 폼 데이터를 검증하는 데 도움을 줄 것입니다.이 도서관은
Formik
입니다.우리 시작합시다!
사용할 도구의 버전:
기본 항목 설정하기
rails를 사용하여 새 프로젝트를 만들려면
rails new
명령을 사용해야 합니다. 이 명령의 끝에는 프로젝트 이름이 있습니다.우리는 또 몇 가지 추가 옵션을 추가할 수 있다.이 예에서 우리는
--database=postgresql
PostgreSQL을 우리의 데이터베이스로 사용하고 --skip-turbolinks
사용을 피할 것이다turbolinks
. 왜냐하면 우리는 전방에서 루트를 처리하고 --webpack=react
Rails로 하여금 우리가 사용할 수 있도록 설정을 생성하기 때문이다.js.$ rails new my-app --database=postgresql --skip-turbolinks --webpack=react
이제 포스트라는 모델을 추가합니다. 두 가지 속성이 있습니다. 타이틀과 바디입니다.title
는 문자열이고 body
는 텍스트입니다.Rails에서 모델은 데이터베이스 테이블을 나타냅니다.우리는 rails generate model
명령을 사용하고 속성을 가진 모델 이름을 따라 그것을 생성할 수 있다.속성은 빈칸으로 구분하고 이름과 유형은 :
로 구분해야 한다. 예를 들어 title:string
.등록 정보의 유형을 지정하지 않으면 Rails는 기본적으로 유형string
으로 설정됩니다.이 명령은 데이터베이스에서 변경할 것을 지정하는 모델 정의가 있는 파일과 이전 파일을 생성합니다. 이 예에서 새 테이블을 만듭니다.
$ rails generate model Post title body:text
$ rails db:create
$ rails db:migrate
Note: We could also use
rails g
which is an alias ofrails generate
.
rails db:create
프로젝트의 데이터베이스를 만들도록 명령하고 rails db:migrate
마운트된 모든 이전을 실행합니다. 새 프로젝트이기 때문에 매번 이전을 실행합니다.우리는 피드 데이터를 추가할 수 있다.이렇게 하려면
db/seeds.rb
파일을 열고 다음 행을 추가해야 합니다.Post.create(title: "Post 1", body: "My first Post")
Post.create(title: "Post 2", body: "My second Post")
피드 데이터로 데이터베이스를 채우려면 다음 명령을 실행해야 합니다.$ rails db:seed
Rails 프로젝트에서, 우리는 응용 프로그램의 주요 경로를 정의해야 한다. 이 응용 프로그램은 처리 경로 /
를 처리할 것이다.이동config/routes.rb
하여 정의한 다음 블록Rails.application.routes.draw
내부에 추가합니다.root to: "home#index"
get "*path", to: "home#index", constraints: { format: "html" }
Note: The routes are defined as "home#index", this means the controller which is going to control the behavior is
HomeController
and the specified action in the controller isindex
.
Home Controller를 만들어야 합니다.우선
home_controller.rb
폴더에 app/controllers
파일을 만듭니다.내부 작업index
추가:class HomeController < ApplicationController
def index; end
end
모든 동작은 HTML을 사용하는 보기를 보여 줍니다.app/views/home
폴더에 보기를 만들고 이름을 index.html.erb
로 지정해야 합니다.이 파일에서, React 프로그램을 불러올 스크립트를 보여 주어야 합니다.<%= javascript_pack_tag 'posts' %>
도우미javascript_pack_tag
가 다음 스크립트 태그를 생성합니다.<script src="/packs/js/posts-a447c92837fa3b701129.js"></script>
Note: The name of the pack is generated with a hash added at the end to let us cached it for a long time.
이 스크립트는 패키지
posts.jsx
를 로드합니다.app/javascript/packs
폴더에 패키지를 만들어야 합니다.import React from "react";
import ReactDOM from "react-dom";
import App from "components/App";
document.addEventListener("DOMContentLoaded", () => {
ReactDOM.render(
<App />,
document.body.appendChild(document.createElement("div"))
);
});
React 응용 프로그램의 라우팅을 처리하려면 @reach/router
를 사용합니다.설치하려면 다음을 실행하십시오.$ yarn add @reach/router
App.js
폴더에 구성 요소app/javascript/components
를 만듭니다.이 구성 요소를 사용하여 경로를 관리할 것입니다.import React from "react";
import { Router } from "@reach/router";
import PostList from "./PostList";
function App() {
return (
<Router>
<PostList path="/" />
</Router>
);
}
export default App;
여기서 첫 번째 노선/
을 만들 것입니다. 이것은 PostList
구성 요소를 렌더링할 것입니다.이제
PostList.js
폴더에 구성 요소 app/javascript/components
를 만들 것입니다.import React from "react";
function PostList() {
return <div>Hello from my React App inside my Rails App!</div>;
}
export default PostList;
내부에서, 우리는 우리의 React 응용 프로그램을 테스트하기 위해 div
을 보여줄 것이다.서버 시작
React와 Rails 애플리케이션을 동시에 실행하려면
foreman
을 설치해야 합니다.다음 명령을 사용하여 설치할 수 있습니다.$ gem install foreman
프로젝트의 루트 디렉터리에 Procfile.dev
파일을 만들어야 합니다.추가:web: bundle exec rails s
webpacker: ./bin/webpack-dev-server
서버를 시작하려면 다음 명령을 실행해야 합니다.$ foreman start -f Procfile.dev
API 생성
JSON: API 규범에 따라 저희 API를 만들기 위해gem
jsonapi-resources
을 사용합니다.그것을 사용하려면 Gemfile
에 추가하고 bundle install
실행할 때 설치해야 합니다.Resources는 올바른 라우팅을 생성하는 데 도움이 되는 방법을 제공합니다.API 라우트는
config/routes.rb
이전 get "*path"
에 추가됩니다.namespace :api do
jsonapi_resources :posts
end
Note:
namespace :api
is going to generate routes with/api
before the route. Eg./api/posts
.
Rails
ApiController
모듈에서 컨트롤러를 확장하기 위해 ActionController::API
를 만들 것입니다. 또한 JSONAPI: Resources의 JSONAPI::ActsAsResourceController
도 포함됩니다.class ApiController < ActionController::API
include JSONAPI::ActsAsResourceController
end
지금 우리는 만들어야 한다PostsController
.api
라는 폴더에 그것을 만들어야 합니다. 왜냐하면 루트 설정이 Api::PostsController
클래스를 검색하기 때문입니다.class Api::PostsController < ApiController
end
jsonapi_resources :posts
정의 요구PostResource
류.우리는 PostResource
에서 만들어야 한다app/resources/api/post_resource.rb
.class Api::PostResource < JSONAPI::Resource
attributes :title, :body
end
여기서, 우리는 자원의 일부분으로 표시할 속성과 관계를 정의했다.답변을 확인하려면
localhost:5000/api/posts
를 방문하십시오.API 사용
React 애플리케이션에서 API를 사용하도록 하겠습니다.우선 데이터만 읽읍시다.
PostList
구성 요소를 편집하여 게시물 목록을 가져옵니다.import React, { useEffect, useState } from "react";
function PostList() {
const [posts, setPosts] = useState([]);
useEffect(() => {
const requestPosts = async () => {
const response = await fetch("/api/posts");
const { data } = await response.json();
setPosts(data);
};
requestPosts();
}, []);
return posts.map(post => <div>{post.attributes.title}</div>);
}
export default PostList;
auseEffect
에서 우리는 /api/posts
를 추출하여 응답을 구성 요소의 상태에 저장할 것이다.이제 더 많은 댓글을 추가하기 위해 폼을 만듭니다.그러나 우선, 우리는 React 프로그램에
formik
를 의존항으로 추가해야 한다.$ yarn add formik
폼을 표시할 새 구성 요소를 만들 것입니다. AddPost.js
라고 부릅니다.이 구성 요소에서, 우리는 정확한 데이터 형식으로 POST 방법 to /api/posts
를 만들어서 새로운 POST를 만들 것입니다.import React from "react";
import { navigate } from "@reach/router";
import { Formik, Field, Form } from "formik";
function AddPost() {
const handleSubmit = values => {
const requestPosts = async () => {
// We get the CSRF token generated by Rails to send it
// as a header in the request to create a new post.
// This is needed because with this token, Rails is going to
// recognize the request as a valid request
const csrfToken = document.querySelector("meta[name=csrf-token]").content;
const response = await fetch("/api/posts", {
method: "POST",
credentials: "include",
headers: {
"Content-Type": "application/vnd.api+json",
"X-CSRF-Token": csrfToken
},
body: JSON.stringify({ data: values })
});
if (response.status === 201) {
navigate("/");
}
};
requestPosts();
};
return (
<div>
<h2>Add your post</h2>
<Formik
initialValues={{
type: "posts",
attributes: {
title: "",
body: ""
}
}}
onSubmit={handleSubmit}
render={() => (
<Form>
<Field type="text" name="attributes.title" />
<Field type="text" name="attributes.body" />
<button type="submit">Create</button>
</Form>
)}
/>
</div>
);
}
export default AddPost;
마지막으로, 우리는 React 프로그램에 노선 /add
을 추가해야 한다.import React from "react";
import { Router } from "@reach/router";
import PostList from "./PostList";
import AddPost from "./AddPost";
function App() {
return (
<Router>
<PostList path="/" />
<AddPost path="/add" />
</Router>
);
}
export default App;
만약 우리가 localhost:5000/add
로 돌아간다면, 우리는 표를 볼 것이다.필드를 작성하고 제출을 클릭하면 새 게시물이 만들어지고 목록의 일부로 자동으로 탐색됩니다localhost:5000/
.만약 우리가 페이지를 다시 불러오면, React 프로그램은 우리가 새로 만든 댓글을 사용하여 우리의 댓글을 다시 얻을 것입니다.
이것이 바로 우리가 Rails+React를 사용하여 응용 프로그램을 만드는 방법입니다. JSON: API 규범에 따릅니다.
나는 이 문장이나 이곳에서 사용하는 도서관에 대한 어떠한 피드백도 얻기를 바란다.❤️
Reference
이 문제에 관하여(Rails 및 React를 사용하여 JSON API 구축 및 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kattyacuevas/building-and-consuming-a-json-api-with-rails-and-react-42p6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)