Giới thiệu
Callbacks là một khái niệm không mới, nó khá quen thuộc và xuất hiện ở hầu hết các ngôn ngữ lập trình. Trong ngôn ngữ C++ ta biết đến callback qua khái niệm delegate (con trỏ hàm). Còn với một ứng dụng Rails, khi ta sử dụng các phương thức như là before_action, before_create,…. chính là đang sử dụng các hàm callbacks. Và trong bài viết này chúng ta sẽ đi tìm hiểu rõ hơn về callbacks trong ruby on rails. Trước tiên, chúng ta sẽ tìm hiểu về vòng đời phát triển của đối tượng.
1. Vòng đời phát triển của đối tượng.
Trong quá trình hoạt động của ứng dụng Rails, đối tượng được tạo ra, có thể được update và destroy. Active Record trong Rails cung cấp cho chúng ta các “hooks” trong vòng đời phát triển của đối tượng để có thể điều khiển và kiểm soát dữ liệu của úng dụng. Callback cho phép chúng ta kích hoạt một logic nào đó trước hoặc sau khi đối tượng thay đổi trạng thái. Và chúng ta có thể định nghĩa như dưới đây.
2. Định nghĩa.
Callback là một phương thức của Active Record, nó sẽ được gọi tới vào một thời điểm nào đó trong vòng đời của một đối tượng. Cho phép ta thực thi các phương thức đã khai báo trước đó một cách tự động trước hoặc sau khi đối tượng được created, saved, updated, deleted, validated hoặc loaded từ database. Vậy khi nào thì ta nên dùng callback.
3. Khi nào cần sử dụng callbacks.
Xét ví dụ nhỏ sau: Giả sử trong UsersController cần sử lý action như show, edit, update, delete như sau :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <span class="token keyword">class</span> <span class="token class-name">UsersController</span> <span class="token operator"><</span> <span class="token constant">ApplicationController</span> <span class="token keyword">def</span> show <span class="token variable">@user</span> <span class="token operator">=</span> <span class="token constant">User</span><span class="token punctuation">.</span>find_by id<span class="token punctuation">:</span> params<span class="token punctuation">[</span><span class="token symbol">:id</span><span class="token punctuation">]</span> <span class="token keyword">end</span> <span class="token keyword">def</span> edit <span class="token variable">@user</span> <span class="token operator">=</span> <span class="token constant">User</span><span class="token punctuation">.</span>find_by id<span class="token punctuation">:</span> params<span class="token punctuation">[</span><span class="token symbol">:id</span><span class="token punctuation">]</span> <span class="token keyword">end</span> <span class="token keyword">def</span> update <span class="token variable">@user</span> <span class="token operator">=</span> <span class="token constant">User</span><span class="token punctuation">.</span>find_by id<span class="token punctuation">:</span> params<span class="token punctuation">[</span><span class="token symbol">:id</span><span class="token punctuation">]</span> <span class="token keyword">if</span> <span class="token variable">@user</span><span class="token punctuation">.</span>update_attributes update_params <span class="token operator">/</span><span class="token operator">/</span>code <span class="token keyword">else</span> <span class="token operator">/</span><span class="token operator">/</span>code <span class="token keyword">end</span> <span class="token keyword">end</span> <span class="token keyword">def</span> destroy <span class="token variable">@user</span> <span class="token operator">=</span> <span class="token constant">User</span><span class="token punctuation">.</span>find_by id<span class="token punctuation">:</span> params<span class="token punctuation">[</span><span class="token symbol">:id</span><span class="token punctuation">]</span> <span class="token variable">@user</span><span class="token punctuation">.</span>destroy <span class="token operator">/</span><span class="token operator">/</span>code <span class="token keyword">end</span> <span class="token keyword">end</span> |
Như ta thấy, cả 4 action đều thực hiện một công việc khi bắt đầu action đó là tìm user trong bảng users bằng params
Nguồn bài viết : Viblo