<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="https://publishpress.com/"
	>

<channel>
	<title>Hổ Nguyễn, Author at Tomoshare</title>
	<atom:link href="https://blog.tomosia.com.vn/author/honguyen/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.tomosia.com.vn/author/honguyen/</link>
	<description>Kênh chia sẻ kiến thức Tomosia Việt Nam</description>
	<lastBuildDate>Wed, 29 Nov 2023 02:55:16 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://blog.tomosia.com.vn/wp-content/uploads/2023/09/cropped-icon-32x32.png</url>
	<title>Hổ Nguyễn, Author at Tomoshare</title>
	<link>https://blog.tomosia.com.vn/author/honguyen/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Building a GraphQL API in Rails</title>
		<link>https://blog.tomosia.com.vn/building-a-graphql-api-in-rails/</link>
					<comments>https://blog.tomosia.com.vn/building-a-graphql-api-in-rails/#comments</comments>
		
		<dc:creator><![CDATA[Hổ Nguyễn]]></dc:creator>
		<pubDate>Wed, 29 Nov 2023 02:55:14 +0000</pubDate>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby On Rails]]></category>
		<category><![CDATA[GraphQL]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=2050</guid>

					<description><![CDATA[<p>Trong thế giới phát triển web, API (Giao diện Lập trình Ứng dụng) đóng vai trò quan trọng&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/building-a-graphql-api-in-rails/">Building a GraphQL API in Rails</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Trong thế giới phát triển web, API (Giao diện Lập trình Ứng dụng) đóng vai trò quan trọng trong việc kích thích sự giao tiếp giữa các hệ thống phần mềm khác nhau. GraphQL, một ngôn ngữ truy vấn dành cho API, đã thu hút sự chú ý lớn với tính linh hoạt và hiệu suất cao trong việc truy xuất dữ liệu.</p>



<p>Trong bài đăng blog này, chúng ta sẽ khám phá quá trình xây dựng một GraphQL API trong Ruby on Rails, một framework mạnh mẽ và thân thiện với nhà phát triển.</p>



<h2 id="graphql-la-gi" class="wp-block-heading">GraphQL là gì?</h2>



<p>GraphQL là một ngôn ngữ truy vấn dành cho API và là một runtime để thực hiện những truy vấn đó đối với dữ liệu của bạn. Khác với các API REST truyền thống, nơi máy khách có kiểm soát hạn chế về dữ liệu mà nó nhận được, GraphQL cho phép máy khách yêu cầu chỉ những dữ liệu cần thiết. Điều này dẫn đến quá trình truy xuất dữ liệu hiệu quả và chính xác hơn.</p>



<h2 id="thiet-lap-du-an-rails" class="wp-block-heading">Thiết Lập Dự Án Rails</h2>



<p>Trước khi đào sâu vào GraphQL, hãy thiết lập một dự án Rails mới. Mở terminal và chạy các lệnh sau:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Bash</span><span role="button" tabindex="0" data-code="rails new graphql_api 
cd graphql_api" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #62E884">rails</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">new</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">graphql_api</span><span style="color: #F6F6F4"> </span></span>
<span class="line"><span style="color: #97E1F1">cd</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">graphql_api</span></span></code></pre></div>



<h2 id="them-dependencies" class="wp-block-heading">Thêm Dependencies</h2>



<p>Để tích hợp GraphQL vào dự án Rails của bạn, bạn sẽ cần thêm một số gems vào Gemfile. Mở Gemfile và bao gồm các dòng sau:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Ruby</span><span role="button" tabindex="0" data-code="# Gemfile 

gem 'graphql' 
gem 'graphiql-rails', group: :development" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #7B7F8B"># Gemfile </span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">gem </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">graphql</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4"> </span></span>
<span class="line"><span style="color: #F6F6F4">gem </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">graphiql-rails</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, group</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">:development</span></span></code></pre></div>



<p>Chạy <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color"><code>bundle install</code> </mark>để cài đặt các gems này.</p>



<h2 id="tao-schema-graphql" class="wp-block-heading">Tạo Schema GraphQL</h2>



<p>Trong GraphQL, schema xác định các loại và các hoạt động có thể thực hiện trên dữ liệu của bạn. Hãy tạo một schema đơn giản cho ứng dụng blog. Chạy lệnh sau để tạo một schema GraphQL mới:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Bash</span><span role="button" tabindex="0" data-code="rails generate graphql:install" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #62E884">rails</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">generate</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">graphql:install</span></span></code></pre></div>



<p>Lệnh này sẽ tạo một thư mục <code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">graphql</mark></code> trong thư mục dự án của bạn, chứa một tệp schema cơ bản (<code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">app/graphql/types/query_type.rb</mark></code>). Tùy chỉnh tệp này để xác định schema GraphQL của bạn.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Ruby</span><span role="button" tabindex="0" data-code="# app/graphql/types/query_type.rb 

module Types 
  class QueryType &lt; Types::BaseObject 
    field :posts, [Types::PostType], null: false 
    
    def posts 
      Post.all
    end 
  end 
end" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #7B7F8B"># app/graphql/types/query_type.rb </span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">module</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Types</span><span style="color: #F6F6F4"> </span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">QueryType</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">&lt;</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Types::BaseObject</span><span style="color: #F6F6F4"> </span></span>
<span class="line"><span style="color: #F6F6F4">    field </span><span style="color: #BF9EEE">:posts</span><span style="color: #F6F6F4">, [</span><span style="color: #97E1F1; font-style: italic">Types</span><span style="color: #F286C4">::</span><span style="color: #BF9EEE">PostType</span><span style="color: #F6F6F4">], null</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">false</span><span style="color: #F6F6F4"> </span></span>
<span class="line"><span style="color: #F6F6F4">    </span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">def</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">posts</span><span style="color: #F6F6F4"> </span></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #97E1F1; font-style: italic">Post</span><span style="color: #F6F6F4">.all</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">end</span><span style="color: #F6F6F4"> </span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">end</span><span style="color: #F6F6F4"> </span></span>
<span class="line"><span style="color: #F286C4">end</span></span></code></pre></div>



<h2 id="dinh-nghia-cac-loai" class="wp-block-heading">Định Nghĩa Các Loại</h2>



<p>Trong ví dụ này, chúng ta đã tạo một trường <code><strong>posts</strong></code> trả về một mảng các đối tượng <code><strong>Post</strong></code>. Bạn cũng cần xác định <code><strong>PostType</strong></code>.</p>



<ul class="wp-block-list">
<li>Đừng quên là hãy chạy lệnh <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">rails generate model Post title:string content:text</mark> và <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">rails db:migrate</mark> để tạo ra bảng <strong>Post</strong> trước</li>
</ul>



<p>Tạo một tệp mới <code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">app/graphql/types/post_type.rb</mark></code>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Ruby</span><span role="button" tabindex="0" data-code="# app/graphql/types/post_type.rb 

module Types 
  class PostType &lt; Types::BaseObject 
    field :id, ID, null: false 
    field :title, String, null: false 
    field :content, String, null: false 
  end 
end" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #7B7F8B"># app/graphql/types/post_type.rb </span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">module</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Types</span><span style="color: #F6F6F4"> </span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">PostType</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">&lt;</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Types::BaseObject</span><span style="color: #F6F6F4"> </span></span>
<span class="line"><span style="color: #F6F6F4">    field </span><span style="color: #BF9EEE">:id</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE">ID</span><span style="color: #F6F6F4">, null</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">false</span><span style="color: #F6F6F4"> </span></span>
<span class="line"><span style="color: #F6F6F4">    field </span><span style="color: #BF9EEE">:title</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE">String</span><span style="color: #F6F6F4">, null</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">false</span><span style="color: #F6F6F4"> </span></span>
<span class="line"><span style="color: #F6F6F4">    field </span><span style="color: #BF9EEE">:content</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE">String</span><span style="color: #F6F6F4">, null</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">false</span><span style="color: #F6F6F4"> </span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">end</span><span style="color: #F6F6F4"> </span></span>
<span class="line"><span style="color: #F286C4">end</span></span></code></pre></div>



<p>Tệp này xác định cấu trúc của một loại <code><strong>Post</strong></code> với các trường <code><strong>id</strong></code>, <code><strong>title</strong></code>, và <code><strong>content</strong></code>.</p>



<h2 id="kiem-thu-voi-graphiql" class="wp-block-heading">Kiểm Thử với GraphiQL</h2>



<p>GraphiQL là một công cụ đồ họa tương tác trực tuyến dành cho GraphQL giúp đơn giản hóa quá trình kiểm thử các truy vấn GraphQL của bạn. Để kích hoạt GraphiQL, mở tệp <code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">config/routes.rb</mark></code> và thêm các dòng sau:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Ruby</span><span role="button" tabindex="0" data-code="# config/routes.rb 

if Rails.env.development? 
  mount GraphiQL::Rails::Engine, at: &quot;/graphiql&quot;, graphql_path: &quot;/graphql&quot; end 
  
post &quot;/graphql&quot;, to: &quot;graphql#execute&quot;" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #7B7F8B"># config/routes.rb </span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">if</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Rails</span><span style="color: #F6F6F4">.env.development? </span></span>
<span class="line"><span style="color: #F6F6F4">  mount </span><span style="color: #97E1F1; font-style: italic">GraphiQL</span><span style="color: #F286C4">::</span><span style="color: #97E1F1; font-style: italic">Rails</span><span style="color: #F286C4">::</span><span style="color: #BF9EEE">Engine</span><span style="color: #F6F6F4">, at</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">/graphiql</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, graphql_path</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">/graphql</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">end</span><span style="color: #F6F6F4"> </span></span>
<span class="line"><span style="color: #F6F6F4">  </span></span>
<span class="line"><span style="color: #F6F6F4">post </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">/graphql</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, to</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">graphql#execute</span><span style="color: #DEE492">&quot;</span></span></code></pre></div>



<p>Bây giờ, khi bạn chạy máy chủ Rails của mình (<code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">rails server</mark></code>), bạn có thể truy cập <code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">http://localhost:3000/graphiql</mark></code> để tương tác với GraphQL API của bạn.</p>



<h2 id="thuc-hien-cac-truy-van" class="wp-block-heading">Thực Hiện Các Truy Vấn</h2>



<p>Bây giờ, bạn có thể kiểm thử các truy vấn GraphQL của mình trong GraphiQL. Ví dụ:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">GraphQL</span><span role="button" tabindex="0" data-code="query {
  posts {
    id
    title
    content
  }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">query</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #E7EE98">posts</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #E7EE98">id</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #E7EE98">title</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #E7EE98">content</span></span>
<span class="line"><span style="color: #F6F6F4">  }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p>Truy vấn này sẽ truy xuất tất cả các bài viết cùng với các trường <strong><code>id</code>, <code>title</code></strong>, và <code><strong>content</strong></code>.</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="582" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screenshot-2023-11-28-at-10.17.45-AM-1024x582.png" alt="" class="wp-image-2056" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screenshot-2023-11-28-at-10.17.45-AM-1024x582.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screenshot-2023-11-28-at-10.17.45-AM-300x170.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screenshot-2023-11-28-at-10.17.45-AM-768x436.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screenshot-2023-11-28-at-10.17.45-AM-1536x873.png 1536w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screenshot-2023-11-28-at-10.17.45-AM-2048x1163.png 2048w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screenshot-2023-11-28-at-10.17.45-AM-380x216.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screenshot-2023-11-28-at-10.17.45-AM-800x454.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screenshot-2023-11-28-at-10.17.45-AM-1160x659.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screenshot-2023-11-28-at-10.17.45-AM.png 2880w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Chúc mừng! Bạn đã xây dựng thành công một GraphQL API trong Ruby on Rails. <br>Happy coding!</p>
<p>The post <a href="https://blog.tomosia.com.vn/building-a-graphql-api-in-rails/">Building a GraphQL API in Rails</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/building-a-graphql-api-in-rails/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>Generating Image Thumbnails in Your Rails Application with CarrierWave</title>
		<link>https://blog.tomosia.com.vn/generating-image-thumbnails-in-your-rails-application-with-carrierwave/</link>
					<comments>https://blog.tomosia.com.vn/generating-image-thumbnails-in-your-rails-application-with-carrierwave/#comments</comments>
		
		<dc:creator><![CDATA[Hổ Nguyễn]]></dc:creator>
		<pubDate>Wed, 15 Nov 2023 09:43:26 +0000</pubDate>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby On Rails]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=1853</guid>

					<description><![CDATA[<p>Bạn đang xây dựng một ứng dụng web trong Rails và muốn cung cấp cho người dùng khả&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/generating-image-thumbnails-in-your-rails-application-with-carrierwave/">Generating Image Thumbnails in Your Rails Application with CarrierWave</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Bạn đang xây dựng một ứng dụng web trong Rails và muốn cung cấp cho người dùng khả năng tải lên và quản lý hình ảnh một cách dễ dàng? Gem CarrierWave là một lựa chọn tuyệt vời giúp bạn thực hiện điều này một cách hiệu quả. Trong bài viết này, chúng ta sẽ khám phá cách sử dụng CarrierWave để tải ảnh trong ứng dụng Rails của bạn.</p>



<h2 id="1-gioi-thieu-ve-carrierwave" class="wp-block-heading" style="font-size:28px;font-style:normal;font-weight:400"><strong>1. Giới Thiệu Về CarrierWave</strong></h2>



<p>CarrierWave là một gem Ruby on Rails mạnh mẽ được thiết kế để giúp bạn quản lý và xử lý tệp tin tải lên, đặc biệt là ảnh. Với tính năng linh hoạt và dễ sử dụng, CarrierWave giúp bạn dễ dàng thay đổi kích thước ảnh, lưu trữ trên các dịch vụ như Amazon S3, và thậm chí cả tạo các phiên bản ảnh thumbnail.</p>



<h2 id="2-cai-dat-carrierwave" class="wp-block-heading" style="font-size:28px;font-style:normal;font-weight:400"><strong>2. Cài Đặt CarrierWave</strong></h2>



<p>Để bắt đầu, thêm gem CarrierWave vào Gemfile của bạn:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Bash</span><span role="button" tabindex="0" data-code="gem 'carrierwave'
" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #62E884">gem</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">carrierwave</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"></span></code></pre></div>



<p>Sau đó, cài đặt và sinh ra file cấu hình:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Bash</span><span role="button" tabindex="0" data-code="bundle install
rails generate uploader Avatar
" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #62E884">bundle</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">install</span></span>
<span class="line"><span style="color: #62E884">rails</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">generate</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">uploader</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">Avatar</span></span>
<span class="line"></span></code></pre></div>



<h2 id="3-su-dung-carrierwave-trong-model" class="wp-block-heading" style="font-size:28px;font-style:normal;font-weight:400"><strong>3. Sử Dụng CarrierWave Trong Model</strong></h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Ruby</span><span role="button" tabindex="0" data-code="class User < ApplicationRecord
  mount_uploader :avatar, AvatarUploader
end
" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">User</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">&lt;</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">ApplicationRecord</span></span>
<span class="line"><span style="color: #F6F6F4">  mount_uploader </span><span style="color: #BF9EEE">:avatar</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE">AvatarUploader</span></span>
<span class="line"><span style="color: #F286C4">end</span></span>
<span class="line"></span></code></pre></div>



<p>Ở đây, <strong><code>avatar</code></strong> là tên của trường chứa đường dẫn đến tệp tin đã được tải lên, và <strong><code>AvatarUploader</code></strong> là tên của uploader đã được sinh ra trước đó.</p>



<h2 id="4-xu-ly-anh-trong-controller" class="wp-block-heading" style="font-size:28px;font-style:normal;font-weight:400"><strong>4. Xử Lý Ảnh Trong Controller</strong></h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Ruby</span><span role="button" tabindex="0" data-code="class UsersController < ApplicationController
  def update
    @user = User.find(params[:id])
    @user.update(user_params)
  end

  private

  def user_params
    params.require(:user).permit(:avatar)
  end
end
" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">UsersController</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">&lt;</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">ApplicationController</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">def</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">update</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #BF9EEE; font-style: italic">@user</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">User</span><span style="color: #F6F6F4">.find(params[</span><span style="color: #BF9EEE">:id</span><span style="color: #F6F6F4">])</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #BF9EEE; font-style: italic">@user</span><span style="color: #F6F6F4">.update(user_params)</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">end</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">private</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">def</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">user_params</span></span>
<span class="line"><span style="color: #F6F6F4">    params.require(</span><span style="color: #BF9EEE">:user</span><span style="color: #F6F6F4">).permit(</span><span style="color: #BF9EEE">:avatar</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">end</span></span>
<span class="line"><span style="color: #F286C4">end</span></span>
<span class="line"></span></code></pre></div>



<h2 id="5-hien-thi-anh-trong-view" class="wp-block-heading" style="font-size:28px;font-style:normal;font-weight:400"><strong>5. Hiển Thị Ảnh Trong View</strong></h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Ruby</span><span role="button" tabindex="0" data-code="<%= image_tag @user.avatar.url if @user.avatar.present? %&gt;
" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">&lt;%=</span><span style="color: #F6F6F4"> image_tag </span><span style="color: #BF9EEE; font-style: italic">@user</span><span style="color: #F6F6F4">.avatar.url </span><span style="color: #F286C4">if</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE; font-style: italic">@user</span><span style="color: #F6F6F4">.avatar.present? </span><span style="color: #DEE492">%&gt;</span></span>
<span class="line"></span></code></pre></div>



<h2 id="6-tinh-nang-mo-rong" class="wp-block-heading" style="font-size:28px;font-style:normal;font-weight:400"><strong>6. Tính Năng Mở Rộng</strong></h2>



<p>CarrierWave cho phép bạn thực hiện nhiều tính năng hấp dẫn như:</p>



<ul class="wp-block-list">
<li><strong>Thay Đổi Kích Thước Ảnh:</strong> </li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Ruby</span><span role="button" tabindex="0" data-code="# Trong AvatarUploader
version :thumb do
  process resize_to_fill: [150, 150]
end" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #7B7F8B"># Trong AvatarUploader</span></span>
<span class="line"><span style="color: #F6F6F4">version </span><span style="color: #BF9EEE">:thumb</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">do</span></span>
<span class="line"><span style="color: #F6F6F4">  process resize_to_fill</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> [</span><span style="color: #BF9EEE">150</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE">150</span><span style="color: #F6F6F4">]</span></span>
<span class="line"><span style="color: #F286C4">end</span></span></code></pre></div>



<ul class="wp-block-list">
<li><strong>Lưu Trữ Trên S3:</strong> </li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Ruby</span><span role="button" tabindex="0" data-code="# Trong config/initializers/carrierwave.rb
config.fog_credentials = {
  provider: 'AWS',
  aws_access_key_id: 'your_access_key',
  aws_secret_access_key: 'your_secret_key',
  region: 'your_region'
}

config.fog_directory = 'your_bucket_name'" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #7B7F8B"># Trong config/initializers/carrierwave.rb</span></span>
<span class="line"><span style="color: #F6F6F4">config.fog_credentials </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">  provider</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">AWS</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">,</span></span>
<span class="line"><span style="color: #F6F6F4">  aws_access_key_id</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">your_access_key</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">,</span></span>
<span class="line"><span style="color: #F6F6F4">  aws_secret_access_key</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">your_secret_key</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">,</span></span>
<span class="line"><span style="color: #F6F6F4">  region</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">your_region</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">config.fog_directory </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">your_bucket_name</span><span style="color: #DEE492">&#39;</span></span></code></pre></div>



<h2 id="7-ket-luan" class="wp-block-heading" style="font-size:28px;font-style:normal;font-weight:400">7. Kết Luận</h2>



<p>Gem CarrierWave không chỉ giúp bạn dễ dàng quản lý tệp tin tải lên mà còn mở ra nhiều khả năng mở rộng. Sử dụng nó để tối ưu hóa trải nghiệm người dùng trong ứng dụng Rails của bạn và tận dụng tất cả những tính năng mà nó mang lại. Happy coding!</p>
<p>The post <a href="https://blog.tomosia.com.vn/generating-image-thumbnails-in-your-rails-application-with-carrierwave/">Generating Image Thumbnails in Your Rails Application with CarrierWave</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/generating-image-thumbnails-in-your-rails-application-with-carrierwave/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Ngrok And Using Ngrok for Rails Application</title>
		<link>https://blog.tomosia.com.vn/ngrok-and-using-ngrok-for-rails-application/</link>
					<comments>https://blog.tomosia.com.vn/ngrok-and-using-ngrok-for-rails-application/#comments</comments>
		
		<dc:creator><![CDATA[Hổ Nguyễn]]></dc:creator>
		<pubDate>Tue, 31 Oct 2023 02:07:03 +0000</pubDate>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[ngrok]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=1588</guid>

					<description><![CDATA[<p>Ngrok là gì? Install Ngrok: Trên MacOS, sử dụng HomeBrew: Trên Linux, sử dụng Apt: Trên Windows, sử&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/ngrok-and-using-ngrok-for-rails-application/">Ngrok And Using Ngrok for Rails Application</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 id="ngrok-la-gi" class="wp-block-heading has-medium-font-size"><strong>Ngrok là gì?</strong></h2>



<ul class="wp-block-list">
<li>Ngrok là một ứng dụng cho phép bạn truy cập từ bên ngoài internet đến hệ thống nội bộ (localhost) thông qua đường hầm an toàn được mã hoá mà ai cũng có thể truy cập được thông qua custom domain của Ngrok.</li>
</ul>



<ul class="wp-block-list">
<li>Trong một ngày đẹp trời khách hàng đang cần một demo gấp mà chưa kịp xây dựng môi trường staging để kiểm thử sản phẩm, việc sử dụng Ngrok là một giải pháp tuyệt vời để giải quyết vấn đề này. </li>



<li>Bạn có thể chạy ứng dụng của mình trên máy tính cá nhân và sử dụng Ngrok để tạo ra một đường link truy cập từ xa. Khách hàng có thể truy cập vào sản phẩm của bạn ngay lập tức, mà không cần phải chờ đợi xây dựng môi trường staging. Điều này giúp tiết kiệm thời gian và giúp bạn đáp ứng nhanh chóng yêu cầu của khách hàng.</li>
</ul>



<h2 id="install-ngrok" class="wp-block-heading has-medium-font-size" style="font-style:normal;font-weight:500"><strong>Install Ngrok</strong>:</h2>



<p>Trên MacOS, sử dụng HomeBrew:</p>



<pre class="wp-block-code"><code><code>brew install ngrok/ngrok/ngrok</code></code></pre>



<p>Trên Linux, sử dụng Apt:</p>



<pre class="wp-block-code"><code>  $ sudo tee /etc/apt/trusted.gpg.d/ngrok.asc &gt;/dev/null &amp;&amp; \\
  $ echo "deb &lt;https://ngrok-agent.s3.amazonaws.com&gt; buster main" | \\
  $ sudo tee /etc/apt/sources.list.d/ngrok.list &amp;&amp; \\
  $ sudo apt update &amp;&amp; sudo apt install ngrok\\
</code></pre>



<p>Trên Windows, sử dụng&nbsp;<a href="https://chocolatey.org/">Chocolatey</a>:</p>



<pre class="wp-block-code"><code><code>choco install ngrok</code></code></pre>



<p><strong>Unzip to install:</strong> Trên Linux hoặc Mac OS X, bạn có thể giải nén ngrok từ terminal bằng lệnh sau. Trên Windows, chỉ cần nhấp đúp vào ngrok.zip để giải nén nó.</p>



<pre class="wp-block-code"><code>$ unzip /path/to/ngrok.zip</code></pre>



<p><strong>Tạo tài khoản trên <a href="https://dashboard.ngrok.com/">ngrok dashboard</a>:</strong></p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="582" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.22.20-PM-2-1024x582.png" alt="" class="wp-image-1594" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.22.20-PM-2-1024x582.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.22.20-PM-2-300x170.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.22.20-PM-2-768x436.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.22.20-PM-2-1536x873.png 1536w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.22.20-PM-2-2048x1163.png 2048w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.22.20-PM-2-380x216.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.22.20-PM-2-800x454.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.22.20-PM-2-1160x659.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.22.20-PM-2.png 2880w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p><strong>Kết nối với tài khoản của bạn:</strong> </p>



<p>Ở đây, chúng ta sẽ cần authtoken từ bước trước. Authtoken là điều mà agent sử dụng để đăng nhập vào tài khoản của bạn khi tạo một đường hầm. Chạy dòng lệnh sau trong dòng lệnh.</p>



<pre class="wp-block-code"><code><code>ngrok config add-authtoken TOKEN</code></code></pre>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="582" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.27.27-PM-2-1024x582.png" alt="" class="wp-image-1597" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.27.27-PM-2-1024x582.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.27.27-PM-2-300x171.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.27.27-PM-2-768x437.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.27.27-PM-2-1536x874.png 1536w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.27.27-PM-2-2048x1165.png 2048w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.27.27-PM-2-380x216.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.27.27-PM-2-800x455.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.27.27-PM-2-1160x660.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.27.27-PM-2.png 2880w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p><strong>Config Ngrok trong Rails development enviroment</strong>: </p>



<ul class="wp-block-list">
<li>Trong ứng dụng của bạn, bạn sẽ có một file <code>config/environments/development.rb</code>. Tệp này cho Rails biết cách cấu hình môi trường phát triển.</li>



<li> <span style="font-size: revert; color: initial; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;;">Ở đây chúng ta sẽ cần thêm một dòng: </span></li>
</ul>



<pre class="wp-block-code"><code><code style="color: initial;">config.hosts &lt;&lt; /.*\\.ngrok-free.app/</code></code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="762" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.33.33-PM-1-1024x762.png" alt="" class="wp-image-1596" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.33.33-PM-1-1024x762.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.33.33-PM-1-300x223.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.33.33-PM-1-768x572.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.33.33-PM-1-1536x1143.png 1536w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.33.33-PM-1-2048x1524.png 2048w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.33.33-PM-1-380x283.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.33.33-PM-1-800x595.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.33.33-PM-1-1160x863.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-25-at-3.33.33-PM-1.png 2252w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Bây giờ chúng ta có thể chạy máy chủ rails của chúng ta: <code>rails s</code> Và connect đến locahost thông qua ngrok bằng câu lệnh sau: <code>ngrok http &lt;port&gt;</code>  </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="624" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-26-at-9.27.42-AM-1024x624.png" alt="" class="wp-image-1599" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-26-at-9.27.42-AM-1024x624.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-26-at-9.27.42-AM-300x183.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-26-at-9.27.42-AM-768x468.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-26-at-9.27.42-AM-1536x935.png 1536w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-26-at-9.27.42-AM-2048x1247.png 2048w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-26-at-9.27.42-AM-380x231.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-26-at-9.27.42-AM-800x487.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-26-at-9.27.42-AM-1160x706.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-26-at-9.27.42-AM.png 2880w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<pre class="wp-block-preformatted">Lưu ý: Thay <code>&lt;port&gt;</code> bằng địa chỉ localhost mà bạn đã cấu hình trong backend. Rails mặc định là 3000, nhưng bạn nên sử dụng bất cứ cái nào bạn muốn.</pre>



<p>Như vậy là bạn đã connect thành công và có thể truy cập đến địa chỉ của ngrok <code>https://9b7c-118-69-55-83.ngrok-free.app</code> để test ở trình duyệt như sau:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="640" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-26-at-9.28.14-AM-1024x640.png" alt="" class="wp-image-1600" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-26-at-9.28.14-AM-1024x640.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-26-at-9.28.14-AM-300x188.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-26-at-9.28.14-AM-768x480.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-26-at-9.28.14-AM-1536x961.png 1536w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-26-at-9.28.14-AM-2048x1281.png 2048w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-26-at-9.28.14-AM-380x238.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-26-at-9.28.14-AM-800x500.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-26-at-9.28.14-AM-1160x725.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screenshot-2023-10-26-at-9.28.14-AM.png 2696w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p><em>Cảm ơn bạn đã đọc bài viết này về tính năng&nbsp;<code>ngrok</code> và cách sử dụng trong rails&nbsp;. Hy vọng rằng bạn đã tìm thấy thông tin hữu ích và có thêm kiến thức về cách sử dụng tính năng này để tạo ra đường hầm kết nối từ localhost đến internet trong ứng dụng của mình</em>. Cảm ơn các bạn đã ủng hộ.</p>
<p>The post <a href="https://blog.tomosia.com.vn/ngrok-and-using-ngrok-for-rails-application/">Ngrok And Using Ngrok for Rails Application</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/ngrok-and-using-ngrok-for-rails-application/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
	</channel>
</rss>
