18/09/2018, 16:42

Các cách sử dụng đối số khi viết Rake task trong rails.

Lời nói đầu Rake task là một cách tuyệt vời để bạn có thể nâng cao hoặc tự động hóa công việc trong project của bạn. Khi lần đầu tiên tôi học ruby, một người đã nói với tôi "Cần thời gian để học viết rake task, nó sẽ giúp ich cho bạn rất nhiều khi code project." Nhưng khi tôi bắt đầu ...

Lời nói đầu

Rake task là một cách tuyệt vời để bạn có thể nâng cao hoặc tự động hóa công việc trong project của bạn. Khi lần đầu tiên tôi học ruby, một người đã nói với tôi "Cần thời gian để học viết rake task, nó sẽ giúp ich cho bạn rất nhiều khi code project."

Nhưng khi tôi bắt đầu viết vấn đề bắt đầy nảy sinh .Đó là làm sao để truyền đối số vào rake task ?????.Chúng ta sẽ cùng đi tìm hiểu nha.

Đến với ví dụ đơn giản khi không có đối số trước:

task :add do
  puts 1 + 2
end

Và khi đó bạn chạy:

$ rake add

# => 3

Và thực tế là bạn không bao giờ chỉ viết một rake task đơn giản và chỉ làm những công việc đơn giản như vậy.

Thông thường chúng ta sẽ có 4 kiểu rake task sau:

Method #1: The Rake Way

  • Rake task sử dụng đối số:
task :add, [:num1, :num] do |t, args|
  puts args[:num1].to_i + args[:num].to_i
end

Và khi ta chạy:

$ rake add[1,2]

# => 3

Với phương pháp này tôi đã dùng nó trong thời gian dài và cảm thấy nó thật dài dòng kể cả khi viết hay chạy nó.

Method #2: Environment Variables

  • khi bạn làm việc với rake task, bạn có thể sẽ biết đến biến môi trường, nếu bạn deploy một project rails, khi đó bạn sẽ phải chạy 1 câu đại loại câu như sau:
$ RAILS_ENV=production bundle exec rake ...

Và trong phương pháp này chúng ta sẽ sử dụng biến môi trường trong khi viểt rake task:

task :add do
  puts ENV['NUM1'].to_i + ENV['NUM2'].to_i
end

Và khi đó chạy sẽ như sau:

$ rake add NUM1=1 NUM2=2

Có vẽ nhưng tốt hơn phương pháp đầu. Nhưng nhiều khi nó có thể thực sự không cần thiết. =))

Method #3: Using ARGV

Khi bạn đọc đến đây bạn có thể nghĩ chắc có một cách nào đó hay hơn những gi bạn đã đọc(có thể sai             </div>
            
            <div class=

0