Chuyển tệp script ruby ​​vào bảng điều khiển rails


117

Có cách nào để chuyển tệp ruby, foo.rb sang bảng điều khiển rails không. Kết quả mong đợi sẽ có sau khi bàn điều khiển khởi động môi trường rails để chạy tệp.

Hoặc bất kỳ cách nào khác cho phép tôi thực thi tệp trong môi trường rails, được kích hoạt từ dấu nhắc lệnh.


Câu trả lời:


166

Trên thực tế, cách đơn giản nhất là chạy nó với loadbên trongrails console

 load './path/to/foo.rb'

5
Điều này hoạt động tuyệt vời. Nhưng trừ khi tôi đang làm gì đó sai, bạn không có quyền truy cập vào các đối tượng được tạo bên trong tập lệnh. Bất kỳ cách nào để làm điều đó? Trường hợp sử dụng là thiết lập một số đối tượng, sau đó tương tác khám phá chúng. Điều đó có thể không?
Dan Barron

1
@DanBarron, bạn có thể đưa vào trình gỡ lỗi hoặc bind.pry
cấp vào

Điều này giống như một Lisp REPL +1
zeitue

Noob help: ./path - là đường dẫn liên quan đến dự án đường ray của bạn nơi tệp của bạn cư trú.
Darpan

87

Bạn có thể dùng

bundle exec rails runner "eval(File.read 'your_script.rb')"

CẬP NHẬT:

Những gì chúng tôi cũng đã sử dụng rất nhiều gần đây là tải môi trường đường ray từ chính tập lệnh. Hãy xem xét doit.rb:

#!/usr/bin/env ruby

require "/path/to/rails_app/config/environment"

# ... do your stuff

Điều này cũng hoạt động nếu tập lệnh hoặc thư mục làm việc hiện tại không nằm trong thư mục của ứng dụng rails.


Cảm ơn rất nhiều điều đó làm một công việc! Tôi đang sử dụng Sublime Văn bản 2 vì vậy bây giờ tôi sẽ có thể kích hoạt được xây dựng của các tầng lớp đường ray và xem kết quả trực tiếp trong IDE :)
Haris Krajina

2
script / runner "eval (File.read 'your_script.rb')" cho rails 2.3 :)
valk

2
bạn có thể sử dụng một mô hình tương tự để chạy tập tin bên trong giao diện điều khiển: f=File.new('path/to/file')để sử dụng chạy:f.rewind; eval f.readlines.join("\n");
semiomant

3
FYI bạn không cần eval(File.read ...)phần này nữa. Rails chấp nhận một tệp Ruby làm đối số cho rails runner:Usage: rails runner [options] [<'Some.ruby(code)'> | <filename.rb>]
Ajedi32

Cập nhật- theo câu trả lời của @ HarisKrajina bên dưới, có vẻ như về mặt rails r path/to/filename.rbchức năng tương đương với bundle exec rails runnerlệnh được đề cập ở trên.
Richie Thomas

61

Trong thời gian chờ đợi, giải pháp này đã được hỗ trợ.

rails r PATH_TO_RUBY_FILE

Bây giờ đơn giản hơn nhiều.


trong những phiên bản Rails nào?
karatedog

1
Tôi nghĩ 3+, tôi có thể xác nhận cho 5.
Haris Krajina

4
script/console --irb=pry < test.rb > test.log

đơn giản, bẩn thỉu và chặn tiến trình ở cuối, nhưng nó thực hiện công việc chính xác như tôi muốn.


4

Cân nhắc tạo một nhiệm vụ cào.

Ví dụ: đối với mã mà tôi cần tạo bản ghi hoặc hỗ trợ di chuyển, tôi thường tạo tác vụ rake như vậy từ câu trả lời này . Ví dụ:

Trong lib/tasks/example.rake:

namespace :example do
    desc "Sample description you'd see if you ran: 'rake --tasks' in the terminal"
    task create_user: :environment do
        User.create! first_name: "Foo", last_name: "Bar"
     end
end

Và sau đó trong terminal chạy:

rake example:create_user

1

Trong số những cách tiếp cận này được đề cập trước đó, không có cách nào có vẻ sạch sẽ và lý tưởng như bạn mong đợi để chạy một tập lệnh độc lập (không nhận được eval-ed hoặc được chuyển hướng qua <redirection), nhưng cuối cùng thì cách này hoàn hảo đối với tôi:

(dành cho Rails 3)

Chèn vào đầu tập lệnh của bạn:

#!/usr/bin/env ruby

APP_PATH = File.expand_path(appdir = '/srv/staging/strat/fundmgr/config/application',  __FILE__)
require File.expand_path(appdir + '/../boot',  __FILE__)
require APP_PATH
# set Rails.env here if desired
Rails.application.require_environment!

# your code here...

Tất nhiên, hãy đặt đường dẫn ứng dụng Rails của riêng bạn trong dòng APP_PATH.

Bằng cách đó, tôi có thể tránh phải nhập bất kỳ tương tác nào irbhoặc rails cvà có thể kiểm tra script.rb của tôi từ dấu nhắc trình bao, trước ví dụ. lập lịch trình trong crontab.

Nó cũng hỗ trợ trơn tru các tham số dòng lệnh và giảm thiểu các cấp độ của trình bao bọc trước khi truy cập vào mã của bạn.

CREDIT (cũng hiển thị ví dụ về Rails 2)

http://zerowidth.com/2011/03/18/standalone-script-runner-bin-scripts-in-rails.html


0

Đây là bản hack mà tôi đang sử dụng:

rr() {
    rails_root="$(bundle exec rails runner "puts Rails.root")"
    rp="$(relpath "$1" "$rails_root")"
    bundle exec rails runner "eval(File.read '$rp')"
}
relpath() {python -c "import os.path; print os.path.relpath('$1','${2:-$PWD}')";}

Thí dụ:

cd ~/rails_project/app/helpers
rr my_script.rb

Dựa trên câu trả lời của @ moritz tại đây. Tôi đã thay đổi nó, vì thư mục làm việc cho File.readlà thư mục gốc của dự án Rails.

Tôi biết đây là một số dị giáo nghiêm trọng, sử dụng python để trợ giúp tập lệnh ruby. Nhưng tôi không thể tìm thấy một relpathphương pháp nào được tích hợp vào ruby.

Tín dụng: relpath()được lấy từ @MestreLion, Chuyển đổi đường dẫn tuyệt đối thành đường dẫn tương đối cho một thư mục hiện tại bằng Bash

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.