2012-04-25 20 views
80

Có cách nào để chuyển tập tin ruby, foo.rb để điều khiển thanh ray hay không. Kết quả mong đợi sẽ là sau khi bàn điều khiển bắt đầu môi trường đường ray để chạy tệp.Vượt qua tập tin kịch bản lệnh ruby ​​để điều khiển đường ray

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 đường ray, được kích hoạt từ dấu nhắc lệnh.

+0

có thể trùng lặp của [Làm thế nào để chạy một file Ruby trong một môi trường Rails?] (Http: //stackoverflow.com/questions/9757261/how-do-i-run-a-ruby-file-in-a-rails-environment) –

Trả lời

17

Trong khi đó, giải pháp này đã được hỗ trợ.

rails r PATH_TO_RUBY_FILE 

Đơn giản hơn nhiều bây giờ.

72

Bạn có thể sử dụng

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

UPDATE:

gì chúng tôi cũng đã được sử dụng rất nhiều thời gian gần đây là để tải môi trường đường ray từ bên trong kịch bản riêng của mình. Cân nhắc doit.rb:

#!/usr/bin/env ruby 

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

# ... do your stuff 
+0

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

+2

script/runner "eval (File.read 'your_script.rb')" cho đường ray 2.3 :) – valk

+2

bạn có thể sử dụng một mẫu tương tự để chạy các tệp trong bảng điều khiển: 'f = File.new ('path/to/file')' để chạy sử dụng: 'f.rewind; eval f.readlines.join ("\ n"); ' – semiomant

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

đơn giản, dơ bẩn, và ngăn chặn quá trình này ở cuối, nhưng nó không được công việc chính xác như tôi muốn.

123

Trên thực tế, cách đơn giản nhất là để chạy nó với load bên trong rails console

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

Công trình này tuyệt vời. Nhưng trừ khi tôi đang làm điều 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. Có cách nào để làm điều đó không? 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? –

+0

Rất dễ dàng. Cảm ơn. – Abram

+0

@DanBarron bạn có thể đặt trong trình gỡ rối hoặc binding.pry – grant

1

Trong đó phương pháp đã đề cập trước, không ai có vẻ sạch sẽ và lý tưởng như bạn mong chờ một kịch bản độc lập để chạy (không nhận được eval- ed hoặc đường ống qua < chuyển hướng), nhưng cuối cùng công trình này hoàn hảo cho tôi:

(đối với Rails 3)

Insert ở phía trên cùng của kịch bản 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 được việc phải nhập bất kỳ tương tác irb hoặc rails c và có thể kiểm tra của tôi script.rb từ dấu nhắc shell, trước ví dụ. lên lịch nó trong crontab.

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

TÍN DỤNG (cũng cho thấy một ví dụ Rails 2)

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

0

Đây là hack 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}')";} 

Ví dụ:

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

Dựa trên @ Moritz của trả lời ở đây. Tôi đã thay đổi nó, vì thư mục làm việc cho File.read là 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 phương pháp relpath được tích hợp vào ruby.

Credit: relpath() được lấy từ @MestreLion, Convert absolute path into relative path given a current directory using Bash

1

Cân nhắc tạo tác vụ cào.

Đối với mã mà tôi cần tạo hồ sơ hoặc hỗ trợ di chuyển, ví dụ, tôi thường tạo một tác vụ cào như thế từ this answer. 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 

Và rồi trong thời gian thiết bị đầu cuối:

rake example:create_user 
Các vấn đề liên quan