Gần đầy rails vừa cập nhật lên phiên bản thứ 6 với một số thay đổi lớn như thay đổi Javascript complier mặc định là Webpacker thay vì assest pipeline (Sprockets) và cập nhật thêm một số method giúp cho lập trình viên làm việc nhanh hơn.
Webpacker là gì?
Việc đầu tiên khi nhắc đến Rails 6 thì webpacker là được chú ý nhiều nhất, vậy webpacker là gì? mà lại được set làm mặc định thay cho sprockets.
Webpacker là gem đóng gói webpack – the popular JavaScript tool used for managing and bundling JavaScript code , nói ngắn gọn thì Webpack là công cụ giúp gói gọn toàn bộ file js, css(bao gồm cả scss,sass,..).
Webpacker giúp chúng ta sử dụng được webpack một cách dễ dàng mà không phải nhức não config nó ( nhưng khá khó để config sâu hơn, nếu người đã biết webpack)
Khi bạn tạo mới ứng dụng rails rails new
bạn sẽ nhìn thấy output dưới console như thế này
1 2 3 4 5 6 7 8 9 10 | rails webpacker:install RAILS_ENV=development environment is not defined in config/webpacker.yml, falling back to production environment create config/webpacker.yml Copying webpack core config create config/webpack create config/webpack/development.js create config/webpack/environment.js create config/webpack/production.js create config/webpack/test.js |
Và bạn sẽ thấy cài rất nhiều package thông qua yarn
Bạn kiểm tra Gemfile
bạn sẽ thấy webpacker
đã được cài đặt mặc định.
Thay đổi nơi chưa javascript code
Ở các phiên bản rails 6 code javascript sẽ được chứa ở app/assets/javascripts
, nhưng từ rails 6 javascript code và code front end sẽ được quản lý tại app/avascripts
1 2 3 4 5 6 7 8 9 10 | testrails tree app/javascripts app/javascript ├── channels │ ├── consumer.js │ └── index.js └── packs └── application.js 2 directories, 3 files |
Có 2 thư mục chính đó là channels
và packs
. Thư mục channels được tạo bởi Action Cable và thư mục pack là thư mục quan trọng nó sẽ chứa tất cả code javascript, image , css, scss…
Ở đây mình sẽ chưa đi sâu vào, ở các bài viết sau minh sẽ tìm hiểu chi tiết hơn.
Thêm shortcut method #pick
Giả sử bạn muốn tìm tên của user có email là: [email protected]
thì bạn sẽ viết như sau
1 2 3 4 | <span class="token constant">User</span><span class="token punctuation">.</span><span class="token function">where</span><span class="token punctuation">(</span>email<span class="token punctuation">:</span> <span class="token string">'<a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="483c2d3b3c082f25292124662b2725">[email protected]</a>'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">limit</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">pluck</span><span class="token punctuation">(</span><span class="token symbol">:name</span><span class="token punctuation">)</span><span class="token punctuation">.</span>first <span class="token comment"># (0.7ms) SELECT "users"."name" FROM "users" WHERE "users"."email" = $1 LIMIT $2 [["email", "<a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="017564727541666c60686d2f626e6c">[email protected]</a>"], ["LIMIT", 1]]</span> <span class="token comment"># => Sang Vo</span> |
Ở rails 6 bạn chỉ cần viết lại như sau:
1 2 3 4 | <span class="token constant">User</span><span class="token punctuation">.</span><span class="token function">where</span><span class="token punctuation">(</span>email<span class="token punctuation">:</span> <span class="token string">'<a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="493d2c3a3d092e24282025672a2624">[email protected]</a>'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">pick</span><span class="token punctuation">(</span><span class="token symbol">:name</span><span class="token punctuation">)</span> <span class="token comment"># (0.7ms) SELECT "users"."name" FROM "users" WHERE "users"."email" = $1 LIMIT $2 [["email", "<a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="a7d3c2d4d3e7c0cac6cecb89c4c8ca">[email protected]</a>"], ["LIMIT", 1]]</span> <span class="token comment"># => Sang Vo</span> |
Method này được định nghĩa như sau:
1 2 3 4 | <span class="token keyword">def</span> <span class="token function">pick</span><span class="token punctuation">(</span><span class="token operator">*</span>column_names<span class="token punctuation">)</span> <span class="token function">limit</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">pluck</span><span class="token punctuation">(</span><span class="token operator">*</span>column_names<span class="token punctuation">)</span><span class="token punctuation">.</span>first <span class="token keyword">end</span> |
Cho phép cấu hình thuộc tính has_secure_password
has_secure_password được dùng để mã hóa và xác thực mật khẩu sử dụng gem Bcrypt khi model có cột password_digest
Trước rails 6 has_secure_password
sẽ không chấp nhận trường nào ngoài password_digest. Nếu muốn sử dụng Bcrypt cho các trường khác ta phải tự định nghĩa lại các phương thức encrypt dựa theo bcrypt và hàm authenticate và lưu trữ chúng.
Từ rails 6 has_secure_password đã có thể custom tham số và mặt định vẫn là trường password
và trường tự định nghĩa phải đặt tên theo dạng column_name_digest
trên model. Và has_secure_password cũng được thêm method authenticate_column_name
để xác thực column đó.
Ta sẽ xem qua ví dụ sau
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <span class="token operator">></span><span class="token operator">></span> <span class="token keyword">class</span> <span class="token class-name">User</span> <span class="token operator"><</span> <span class="token constant">ApplicationRecord</span> <span class="token operator">></span><span class="token operator">></span> has_secure_password <span class="token operator">></span><span class="token operator">></span> has_secure_password <span class="token symbol">:activation</span> <span class="token operator">></span><span class="token operator">></span> <span class="token keyword">end</span> <span class="token operator">></span><span class="token operator">></span> user <span class="token operator">=</span> <span class="token constant">User</span><span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span>email<span class="token punctuation">:</span> <span class="token string">'<a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="d0a4b5a3a490b7bdb1b9bcfeb3bfbd">[email protected]</a>'</span><span class="token punctuation">,</span> password<span class="token punctuation">:</span> <span class="token string">'1234456'</span><span class="token punctuation">,</span> activation<span class="token punctuation">:</span> <span class="token string">'kBmLNImbhr2u6fgSljZ2Ww=='</span><span class="token punctuation">)</span> <span class="token keyword">BEGIN</span> <span class="token constant">User</span> <span class="token constant">Create</span> <span class="token punctuation">(</span><span class="token number">0.5</span>ms<span class="token punctuation">)</span> <span class="token constant">INSERT</span> <span class="token constant">INTO</span> <span class="token string">"users"</span> <span class="token punctuation">(</span><span class="token string">"email"</span><span class="token punctuation">,</span> <span class="token string">"password_digest"</span><span class="token punctuation">,</span> <span class="token string">"activation_digest"</span><span class="token punctuation">,</span> <span class="token string">"created_at"</span><span class="token punctuation">,</span> <span class="token string">"updated_at"</span><span class="token punctuation">)</span> <span class="token constant">VALUES</span> <span class="token punctuation">(</span>$<span class="token number">1</span><span class="token punctuation">,</span> $<span class="token number">2</span><span class="token punctuation">,</span> $<span class="token number">3</span><span class="token punctuation">,</span> $<span class="token number">4</span><span class="token punctuation">,</span> $<span class="token number">5</span><span class="token punctuation">)</span> <span class="token constant">RETURNING</span> <span class="token string">"id"</span> <span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token string">"email"</span><span class="token punctuation">,</span> <span class="token string">"<a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="94e0f1e7e0d4f3f9f5fdf8baf7fbf9">[email protected]</a>"</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string">"password_digest"</span><span class="token punctuation">,</span> <span class="token string">"$2a$10$nUiO7E2XrIJx/sSdpG0JAOL00uFvPRH7kXHLk5f/6qA1zLPHIrpPy"</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string">"activation_digest"</span><span class="token punctuation">,</span> <span class="token string">"$2a$10$l6cTpHwV9xOEn2.OumI29OnualGpvr1CgrNrbuMuHyGTltko8eBG2"</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string">"created_at"</span><span class="token punctuation">,</span> <span class="token string">"2019-11-17 23:42:28.723431"</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string">"updated_at"</span><span class="token punctuation">,</span> <span class="token string">"2019-11-17 23:42:28.723431"</span><span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token constant">COMMIT</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token comment">#<User id: 5, email: "<a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="f783928483b7909a969e9bd994989a">[email protected]</a>", password_digest: [FILTERED], activation_digest: [FILTERED], created_at: "2019-11-17 23:42:28", updated_at: "2019-11-17 23:42:28"></span> <span class="token operator">></span><span class="token operator">></span> user<span class="token punctuation">.</span><span class="token function">authenticate</span><span class="token punctuation">(</span><span class="token string">'1234456'</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token comment">#<User id: 5, email: "<a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="85f1e0f6f1c5e2e8e4ece9abe6eae8">[email protected]</a>", password_digest: [FILTERED], activation_digest: [FILTERED], created_at: "2019-11-17 23:42:28", updated_at: "2019-11-17 23:42:28"></span> <span class="token operator">></span><span class="token operator">></span> user<span class="token punctuation">.</span><span class="token function">authenticate_activation</span><span class="token punctuation">(</span><span class="token string">'kBmLNImbhr2u6fgSljZ2Ww=='</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token comment">#<User id: 5, email: "<a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="0571607671456268646c692b666a68">[email protected]</a>", password_digest: [FILTERED], activation_digest: [FILTERED], created_at: "2019-11-17 23:42:28", updated_at: "2019-11-17 23:42:28"></span> |
Phủ định của enum
Khi bạn khai báo enum một trường của model Rails sẽ thêm chúng ta một số default scope để filter dữ liệu theo giá trị đó.
Ví dụ
1 2 3 4 5 6 7 | <span class="token keyword">class</span> <span class="token class-name">Post</span> <span class="token operator"><</span> <span class="token constant">ActiveRecord</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Base</span> enum status<span class="token punctuation">:</span> <span class="token string">%i[drafted active trashed]</span> <span class="token keyword">end</span> <span class="token constant">Post</span><span class="token punctuation">.</span>drafted <span class="token comment"># => where(status: :drafted) // Get tất cả các post với trạng thái drafter</span> <span class="token constant">Post</span><span class="token punctuation">.</span>active <span class="token comment"># => where(status: :active) // Get tất cả các bài post có trạng thái active</span> |
Rails 6 cung cấp ta phủ định của các giá trị này bằng cách thêm tiền tố not_scope
1 2 3 4 5 6 7 | <span class="token keyword">class</span> <span class="token class-name">Post</span> <span class="token operator"><</span> <span class="token constant">ActiveRecord</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Base</span> enum status<span class="token punctuation">:</span> <span class="token string">%i[drafted active trashed]</span> <span class="token keyword">end</span> <span class="token constant">Post</span><span class="token punctuation">.</span>not_drafted <span class="token comment"># => where.not(status: :drafted)</span> <span class="token constant">Post</span><span class="token punctuation">.</span>not_active <span class="token comment"># => where.not(status: :active)</span> |
Tổng kết
Trên đây mình đã tổng hợp một số cập nhật về rails 6 hi vọng sẽ giúp ích cho các bạn.
Happy Codding~!
Tham khảo
https://blog.bigbinary.com/
https://weblog.rubyonrails.org/releases/