रूबी स्क्रिप्ट फ़ाइल को रेल कंसोल में पास करें


117

क्या रूबी फ़ाइल को पास करने का एक तरीका है, foo.rb से रेल कंसोल। सांत्वना रेल चलाने के लिए फ़ाइल चलाने के बाद अपेक्षित परिणाम होगा।

या किसी अन्य तरीके से जो मुझे रेल के वातावरण में फ़ाइल निष्पादित करने की अनुमति देगा, कमांड प्रॉम्प्ट से ट्रिगर किया गया।


जवाबों:


166

दरअसल, इसका सबसे सरल तरीका है कि इसे loadअंदर से चलाया जाएrails console

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

5
यह बहुत अच्छा काम करता है। लेकिन जब तक मैं कुछ गलत नहीं कर रहा हूं, आपके पास स्क्रिप्ट के अंदर बनाई गई वस्तुओं तक पहुंच नहीं है। ऐसा करने का कोई तरीका? उपयोग का मामला कुछ वस्तुओं को सेट करना है, फिर अंतःक्रियात्मक रूप से उनका पता लगाना है। क्या यह संभव है?
दान बैरन

1
@DanBarron आप एक डिबगर या बाइंडिंग में रख सकते हैं।प्री
अनुदान

यह एक लिस्प REPL +1 जैसा है
zeitue

Noob help: ./path - आपकी रेल परियोजना के सापेक्ष पथ है जहाँ आपकी फ़ाइल रहती है।
डारपैन

87

आप उपयोग कर सकते हैं

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

अपडेट करें:

हम जो हाल ही में बहुत प्रयोग कर रहे हैं वह रेल के वातावरण को स्क्रिप्ट के भीतर से ही लोड करना है। विचार करें doit.rb:

#!/usr/bin/env ruby

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

# ... do your stuff

यह भी काम करता है यदि स्क्रिप्ट या वर्तमान कार्यशील निर्देशिका रेल एप्लिकेशन की निर्देशिका में नहीं है।


बहुत बहुत धन्यवाद कि एक काम करता है! मैं उदात्त पाठ 2 का उपयोग कर रहा हूं, इसलिए अब मैं रेल कक्षाओं का निर्माण शुरू करूंगा और सीधे आईडीई में आउटपुट देखूंगा :)
हारिस क्रजिना

2
पटकथा / रनर "eval (File.read 'your_script.rb')" रेल के लिए 2.3 :)
valk

2
आप कंसोल के अंदर फ़ाइलों को चलाने के लिए एक समान पैटर्न का उपयोग कर सकते हैं: f=File.new('path/to/file')उपयोग करने के लिए:f.rewind; eval f.readlines.join("\n");
सेमीोमेंट

3
FYI करें आपको eval(File.read ...)अब भाग की आवश्यकता नहीं है। रूबी एक रूबी फ़ाइल को एक तर्क के रूप में स्वीकार करती है rails runner:Usage: rails runner [options] [<'Some.ruby(code)'> | <filename.rb>]
Ajedi32

अद्यतन- नीचे दिए गए @ हरिसकृजिना के उत्तर के अनुसार, ऐसा लगता है rails r path/to/filename.rbकि कार्यात्मक bundle exec rails runnerरूप से ऊपर उल्लिखित कमांड के बराबर है ।
रिची थॉमस


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

सरल, गंदा, और प्रक्रिया को अंत में अवरुद्ध करें, लेकिन यह ठीक उसी तरह काम करता है जैसे मैं चाहता था।


4

एक रेक कार्य बनाने पर विचार करें।

कोड के लिए जिसे मुझे रिकॉर्ड बनाने या माइग्रेशन का समर्थन करने की आवश्यकता है, उदाहरण के लिए, मैं अक्सर इस उत्तर से एक रेक कार्य बनाता हूं । उदाहरण के लिए:

इन 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

और फिर टर्मिनल रन में:

rake example:create_user

1

पहले बताए गए इन तरीकों में से, कोई भी साफ और आदर्श नहीं लगता था, जैसे आप एक स्टैंडअलोन स्क्रिप्ट को चलाने की उम्मीद करेंगे (न कि ई-एड या पाइप के माध्यम से <redirection), लेकिन अंत में यह मेरे लिए एकदम सही है:

(रेल के लिए 3)

अपनी स्क्रिप्ट के शीर्ष पर सम्मिलित करें:

#!/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...

बेशक, APP_PATH लाइन में अपना खुद का रेल एप्लिकेशन पथ सेट करें।

इस तरह, मैं किसी भी इंटरएक्टिव में प्रवेश करने से बच सकता हूं irbया उदाहरण के पहले शेल प्रॉम्प्ट से rails cअपनी script.rb का परीक्षण कर सकता हूं । Crontab में इसे शेड्यूल करना।

यह सुचारू रूप से कमांड-लाइन मापदंडों का भी समर्थन करता है, और आपके कोड में आने से पहले रैपर के स्तर को कम करता है।

CREDIT (एक रेल 2 उदाहरण भी दिखाता है)

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


0

यहां वह हैक है जिसका मैं उपयोग कर रहा हूं:

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}')";}

उदाहरण:

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

यहाँ पर @ moritz के उत्तर के आधार पर। मैंने इसे बदल दिया, क्योंकि File.readरेल परियोजना के लिए कार्यशील निर्देशिका रूट है।

मुझे पता है कि यह कुछ गंभीर विधर्म है, रूबी स्क्रिप्ट की मदद के लिए अजगर का उपयोग करना। लेकिन मुझे relpathमाणिक में निर्मित विधि नहीं मिली ।

क्रेडिट: relpath()@MestreLion से लिया गया था, Bash का उपयोग करके एक वर्तमान निर्देशिका दी गई सापेक्ष पथ में कनवर्ट करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.