Mở đầu
Với Rails console, bạn có thể tương tác với ứng dụng Rails từ dòng lệnh mà không cần sử dụng trình duyệt web. Nó là một sell IRB mạnh mẽ được tải với môi trường Rails.
Bạn cũng có thể sử dụng Rails console cho truy vấn cơ sở dữ liệu, test hoặc debug ứng dụng rails mà không cần sử dụng tương tác trình duyệt.
Rất nhiều developers ở cấp độ mới bắt đầu không nhận thức được thực tế này. Bạn có thể test lệnh với backend của ứng dụng. Những phương pháp này ở đây có thể làm dễ dàng hơn cho bạn.
Bạn không còn phải đợi trước trình duyệt để kiểm tra đầu ra của mình.
Starting Console
Bây giờ, chúng ta chạy rails console bằng lệnh sau:
1 2 | $ rails console |
Hoặc ngắn gọn
1 2 | $ rails c |
Changing Environment
Theo mặc định khi bạn chạy rails console, nó sẽ kích hoạt trong mode development.
1 2 3 4 | $ rails console <span class="token constant">Loading</span> development environment <span class="token punctuation">(</span><span class="token constant">Rails</span> <span class="token number">5.2</span><span class="token number">.3</span><span class="token punctuation">)</span> |
Nếu bạn mướn mở Rails console trong một môi trường cụ thể, bạn có thể sử dụng option -e với tên môi trường.
Ví dụ, chúng ta muốn mở Rails console trong mode production:
1 2 3 4 | $ rails console <span class="token operator">-</span>e production <span class="token constant">Loading</span> production environment <span class="token punctuation">(</span><span class="token constant">Rails</span> <span class="token number">5.2</span><span class="token number">.3</span><span class="token punctuation">)</span> |
Clearing Console
Đôi khi ta không thích làm việc dưới cùng của cửa sổ hoặc khi có dữ liệu đầu ra lớn trên không gian làm việc. Lệnh Clear sẽ không hoạt động trong Rails console, nó sẽ trả về như sau:
1 2 3 4 | <span class="token operator">></span> clear <span class="token constant">NameError</span> <span class="token punctuation">(</span>undefined local variable <span class="token keyword">or</span> method `clear' <span class="token keyword">for</span> main<span class="token symbol">:Object</span><span class="token punctuation">)</span> |
Nếu ta muốn clear rails console, ta sử dụng ctrl+l trong môi trường Linux hoặc lệnh +k để clear trong mac.
Reloading Console
Trong nôi trường development, mã ứng dụng sẽ tự động tải lại cho mọi request mới. Đôi khi bạn thay đổi hoặc thêm thư mục mới, bạn cần tải lại trình duyệt để xem những thay đổi trong ứng dụng rails.
Rails console đang chạy mặc định trong môi trường development, nhưng nó không tải lại các thay dổi mới. Tại thời điểm bắt đầu rails console, tất cả các tệp được tải và lưu trữ trong cache cho đến khi kết thúc rails console. Nếu bạn cần thay đổi mới trong rails console, bạn có thể thoát khỏi rails console và bắt đầu lại. Nhưng nó không phải là một ý tưởng tốt khi chúng ta thường xuyên thay đổi code. Thay vì điều này, chúng ta có thể sử dụng lệnh sau để làm mới những thay đổi mới:
1 2 3 4 5 6 | <span class="token operator">></span> reload<span class="token operator">!</span> <span class="token constant">Reloading</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token keyword">true</span> |
Autocomplete
Rails console có mặc định được dựng trong chức năng autocomplete. Khi bắt đầu nhập tên class và nhấn TAB, nó sẽ tự động hoàn thành nó hoặc nó sẽ hiển thị danh sách cách options có sẵn. Nó sẽ chỉ hoạt động với class tích hợp Ruby và Rails mặc định.
1 2 3 4 | <span class="token operator">></span> <span class="token builtin">Hash</span> <span class="token constant">TAB</span> <span class="token builtin">Hash</span> <span class="token constant">HashWithIndifferentAccess</span> |
Chúng ta cũng có thể sử dụng autocomplate cho tên method của bất kỳ class hoặc object nào.
1 2 3 4 | <span class="token operator">></span> <span class="token builtin">Hash</span><span class="token punctuation">.</span><span class="token constant">TAB</span> <span class="token constant">Display</span> all <span class="token number">179</span> possibilities<span class="token operator">?</span> <span class="token punctuation">(</span>y <span class="token keyword">or</span> n<span class="token punctuation">)</span> |
Giả sử ta muốn autocomplete cho model và controllder có sẵn trong thư mục /app, điều này không thể thực hiện được lần đầu tiên. Nếu ta đã sử dụng rails console, thì ta có thể.
Ví dụ, chúng ta có model Product. Chúng ta đã sử dụng trong rails console và bây giờ chúng ta muốn sử dụng nó để chạy query. Bây giờ, chúng ta có thể gõ Pro, nó sẽ trả về các options có sẵn.
1 2 3 4 | <span class="token operator">></span> <span class="token constant">Pro</span> <span class="token constant">TAB</span> <span class="token builtin">Proc</span> <span class="token constant">Process</span> <span class="token constant">Product</span> |
Giả sử bạn gõ ‘Prod, nó sẽ autocomplete ra model Product.
1 2 3 4 | <span class="token operator">></span> <span class="token constant">Prod</span> <span class="token constant">TAB</span> <span class="token operator">></span> <span class="token constant">Product</span> |
Giả sử bạn muốn autocomplete các method do người lập trình định nghĩa trong model, chúng ta lấy nó từ object Product.
1 2 3 4 | <span class="token operator">></span> product<span class="token punctuation">.</span>ge product<span class="token punctuation">.</span>gem product<span class="token punctuation">.</span>get_discount_amt product<span class="token punctuation">.</span>get_product_name product<span class="token punctuation">.</span>get_selling_price |
Searching Command History
Giả sử chúng ta muốn trả về các query đã sử dụng hoặc để sửa đổi query và chạy, rails console cung cấp ta 2 options.
- Chúng ta sử dụng mũi tên lên và xuống, bạn nên nhớ lại các lệnh đã sử dụng trước đó. Sử dụng mũi tên lên, chúng ta có thể xem code đã được sử dụng trước đó và sử dụng mũi tên xuống để quay lại.
- Giả sử bạn đang sử dụng rất nhiều query trong rails console, sử dụng mũi tên để tìm query sẽ mất nhiều thời gian hơn. Chúng ta có thể sử dụng lệnh tìm kiếm Unix bash shell ở đây. Bằng cách sử dụng Ctrl+r, chúng ta có thể tìm kiếm query được sử dụng trước đó ở phía sau và trả về query đầu tiên phù hợp với chuỗi tìm kiếm của ta.
Last Expression
Đôi khi, khi đã gõ query và nhấn enter, nó sẽ trả về kết quả. Dựa trên kết quả này, bạn có thể thực hiện một số thao tác. Hãy nói, bạn quên gắn kết một biến, nếu tình huống này phát sinh, chỉ cần nhấn mũi tên lên và gán cho biến và enter.
Rails console cung cấp chúc năng tuyệt vời cho việc này. Nó lưu trữ biến thức cuối cùng trong biến ‘_'(gạch dưới).
1 2 | <span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">where</span><span class="token punctuation">(</span><span class="token string">'mrp < 100'</span><span class="token punctuation">)</span> |
Bây giờ nhấn enter nó sẽ trả về kết quả, ta có thể gán nhứng kết quả đó trong một số biến. giá trị _ sẽ liên tục thay đổi dựa trên biểu thức cuối cùng chúng ta chạy.
1 2 3 4 5 6 | <span class="token operator">></span> products <span class="token operator">=</span> _ <span class="token operator">></span> products<span class="token punctuation">.</span>count <span class="token operator">=</span><span class="token operator">></span> <span class="token number">12</span> |
Bây giờ chúng ta kiểm tra biến _. Nó có giá trị là 12 vì nó chỉ lưu trưc giá trị biểu thức cuối cùng.
1 2 3 4 | <span class="token operator">></span> _ <span class="token operator">=</span><span class="token operator">></span> <span class="token number">12</span> |
Vô hiệu hóa CSRF Token
Ví dụ, ta muốn kiểm tra method create product qua console, ở đây, ta có thể sử dụng dòng sau để gọi method create cho product:
1 2 | <span class="token operator">></span> app<span class="token punctuation">.</span>post <span class="token string">"/products"</span><span class="token punctuation">,</span> params<span class="token punctuation">:</span> <span class="token punctuation">{</span>name<span class="token punctuation">:</span> <span class="token string">"pen"</span><span class="token punctuation">}</span> |
Nó sẽ trả về response:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token constant">Started</span> <span class="token constant">POST</span> <span class="token string">"/products"</span> <span class="token keyword">for</span> <span class="token number">127.0</span><span class="token number">.0</span><span class="token number">.1</span> at <span class="token number">2019</span><span class="token operator">-</span><span class="token number">08</span><span class="token operator">-</span><span class="token number">03</span> <span class="token number">22</span><span class="token punctuation">:</span><span class="token number">00</span><span class="token punctuation">:</span><span class="token number">09</span> <span class="token operator">+</span><span class="token number">0530</span> <span class="token constant">Processing</span> by <span class="token constant">ProductsController</span><span class="token comment">#create as HTML</span> <span class="token constant">Parameters</span><span class="token punctuation">:</span> <span class="token punctuation">{</span><span class="token string">"name"</span><span class="token operator">=</span><span class="token operator">></span><span class="token string">"pen"</span><span class="token punctuation">}</span> <span class="token constant">Can</span>'t verify <span class="token constant">CSRF</span> token authenticity<span class="token punctuation">.</span> <span class="token constant">Completed</span> <span class="token number">422</span> <span class="token constant">Unprocessable</span> <span class="token constant">Entity</span> <span class="token keyword">in</span> <span class="token number">2</span>ms <span class="token punctuation">(</span><span class="token constant">ActiveRecord</span><span class="token punctuation">:</span> <span class="token number">0.0</span>ms<span class="token punctuation">)</span> <span class="token constant">ActionController</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">InvalidAuthenticityToken</span> <span class="token punctuation">(</span><span class="token constant">ActionController</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">InvalidAuthenticityToken</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token punctuation">(</span>irb<span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token number">22</span><span class="token symbol">:in</span> `irb_binding' <span class="token operator">=</span><span class="token operator">></span> <span class="token number">422</span> |
Sử dụng lệnh sau ta có thể vô hiệu hóa xác thực của mã thông báo CSRF.
1 2 | <span class="token constant">ApplicationController</span><span class="token punctuation">.</span>allow_forgery_protection <span class="token operator">=</span> <span class="token keyword">false</span> |
Bây giờ ta có thể gọi method create để tạo 1 product, nó sẽ hoạt động như mong đợi.
Sandbox
Sanbox là một option rất tốt để tương tác vơi ứng dụng rails, đặc biệt là trong môi trường development. Nó sẽ khôi phục hoặc hoàn nguyên tất cả các thay đổi chúng ta đã thực hiện trong cơ sở dữ liệu khi chúng ta thoát khỏi rails console.
Ví dụ, chúng ta sẽ test một số code trong rails console mà không thay đổi dữ liệu, có thể gọi rails console với option -sandbox.
1 2 3 4 5 6 | $ rails console <span class="token operator">-</span>e production <span class="token operator">--</span>sandbox <span class="token constant">Loading</span> production environment <span class="token keyword">in</span> sandbox <span class="token punctuation">(</span><span class="token constant">Rails</span> <span class="token number">5.2</span><span class="token number">.3</span><span class="token punctuation">)</span> <span class="token constant">Any</span> modifications you make will be rolled back on exit |
tiếp theo chúng ta xóa 1 product để test option -sandbox.
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token operator">></span> <span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">destroy</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token constant">Product</span> <span class="token constant">Destroy</span> <span class="token punctuation">(</span><span class="token number">0.7</span>ms<span class="token punctuation">)</span> <span class="token constant">DELETE</span> <span class="token constant">FROM</span> <span class="token string">"products"</span> <span class="token constant">WHERE</span> <span class="token string">"products"</span><span class="token punctuation">.</span><span class="token string">"id"</span> <span class="token operator">=</span> $<span class="token number">1</span> <span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token string">"id"</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 operator">></span> <span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token constant">ActiveRecord</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">RecordNotFound</span> <span class="token punctuation">(</span><span class="token constant">Couldn</span><span class="token string">'t find Product with '</span>id'<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">></span> exit <span class="token constant">ROLLBACK</span> |
Đối với ví dụ trên, ta đã xóa 1 product, khi ta thoát khỏi rails console, tất cả các thao tác với cơ sở dữ liệu đều được khôi phục. Để bắt đầu một thao tác mới và test xem các thao tác với cơ sở dữ liệu có thực sự được phục hồi hay không.
1 2 3 4 5 6 | $ rails console <span class="token operator">-</span>e production <span class="token operator">--</span>sandbox <span class="token operator">></span> <span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token comment">#<Product id: 1, name: "Apple", ….></span> |
Nếu ta thực sự cần thay đổi cơ sở dữ liệu, ta xóa option -sandbox.
Source Location
Trong khi làm việc với rails console, method source_location chúng ta có thể thấy method được xác định và thực hiện chi tiết của method. Ví dụ, model Product của chúng ta có method instance discount_amount, chúng ta có thể nhận được vị trí của method discount_amount như sau:
1 2 3 4 | <span class="token operator">></span> <span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">instance_method</span><span class="token punctuation">(</span><span class="token symbol">:discount_amount</span><span class="token punctuation">)</span><span class="token punctuation">.</span>source_location <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token string">"/home/arjun/Sampl_work/rr/app/models/product.rb"</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">]</span> |
Chúng ta có thể gọi trực tiếp soure_location. Đầu tiên, chúng ta gọi instance_method trên model Product bằng cách chuyền tên method làm đối số, điều này sẽ trả về object, nó đại diện cho method discount_amount. Từ object này, chúng ta có thể gọi vị trí soure của method.
Vị trí soure trả về đầu ra dưới dạng 1 mảng gồm hai giá trị. Giá trị đầu tiên đại diện vị trí của tệp và giá trị thú hai đại diện cho số dòng nơi method được định nghĩa.
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token operator">></span> helper<span class="token punctuation">.</span><span class="token function">pluralize</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token string">'person'</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">"5 people"</span> <span class="token operator">></span> helper<span class="token punctuation">.</span><span class="token function">number_to_currency</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">"$100.00"</span> <span class="token operator">></span> helper<span class="token punctuation">.</span><span class="token function">number_to_human</span><span class="token punctuation">(</span><span class="token number">1000</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">"1 Thousand"</span> |
Nếu bạn muốn biết tất cả các method helper có sẵn, hãy sử dụng lệnh sau trong rails console, nó sẽ trả về danh sách các method helper.
1 2 | <span class="token operator">></span> helper<span class="token punctuation">.</span>methods |
Listing tables
Giả sử bạn muốn biết chúng ta đã sử dụng bao nhiêu bảng trong cơ sở dữ liệu của mình, bạn có thể sử dụng lệnh sau để liệt kê tất cả các tên bảng:
1 2 3 4 | <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><span class="token punctuation">.</span>connection<span class="token punctuation">.</span>tables <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token string">"schema_migrations"</span><span class="token punctuation">,</span> <span class="token string">"ar_internal_metadata"</span><span class="token punctuation">,</span> <span class="token string">"products"</span><span class="token punctuation">,</span> <span class="token string">"articles"</span><span class="token punctuation">]</span> |
Kết luận
Như vậy đây là 10 mẹo và cách viết tắt về raisl console, hi vọng các có thể ứng dụng khi lúc cần :v.
tài liệu tham khảo:
https://www.agiratech.com/rails-console-shortcuts-to-boost-productivity-ruby-on-rails-guide/