Save and Run Rails Script - ruby-on-rails

Is it possible to write a set of commands - similar to what you'd find in a controller - but save it as a standalone file in my rails app that I could call up and run from the console?
For instance, something to loop through my database and run some ActiveRecord commands to modify data that may need to be cleaned up from time to time, but I don't want to live inside a controller. It's large - too large for me to copy/paste it into the rails console - which is why I'm trying to make a file out of it.

You can write your code into a separate file, let's say myCode.rb and run it from the console with rails runner myCode.rb (run this command from the directory you saved the file to). rails runner gives you access to your rails environment.
Hope this helps.

I took your advice, Tony, and looked into making my own rake tasks and that seemed to do the trick!
I made a new .rake file inside my lib/tasks folder and just copied and pasted my block of code inside there. I had to set it to inherit from the environment, as stated in the post I read, but it seems to work fine now - thanks for the tip!

Related

Where do I put a recurring script that updates database from api in rails

I have a Rails app set up with a model Account that should be updated every morning with data coming from an external API I'm calling (a CRM). Basically either I create new accounts in my app that I find in the CRM and some of the fields that are mapped with my columns, either I find the account if it already exists and I update it.
So far, I've been putting this code into the seeds.rb file and from Heroku, where the app is hosted, I set up a scheduler with the command : rails db:seed that runs periodically.
My issue is that I'm sure there is a better way of doing this. I've read about rake tasks but I did not quite understand how that applied to my case. Otherwise I thought of putting my method in the models/account.rb file as a self method. But I don't really know how I can invoke it in a rake command to allow me to set up a scheduler in Heroku.
Any idea on where would be the best place to put this method, and how to call it from command line?
Thanks in advance.
You can create a script directory in your project, and put your script from db/seeds.rb into this directory, maybe called update_accounts.rb. Then you can run it with
rails runner script/update_accounts.rb
and schedule that task in heroku. More info about rails runner here.
I would suggest using a background processor such as Sidekiq: https://github.com/mperham/sidekiq
Once using Sidekiq, you need a scheduler like https://github.com/moove-it/sidekiq-scheduler to make sure it happens periodically as you require.
This will become easier to maintain as your application grows and you need more workers. It also moves your scheduling into version control.

Ruby on Rails - Can I call a Controller:Method from a batch routine in windows?

I'm relatively new to RoR working on Windows. I built a simple app in Rails that sends email using ActionMailer. I'd like to add a task to my windows scheduler to run a batch routine that calls my email method inside of my controller. The web app will not be running when I do this, so I can't do a CURL or something similar. Is there a way to run Ruby.exe with some args to launch a rails app (similar to irb) and call a controller:method?
Update: I took the advice in the answer I marked correct, but I thought I'd elaborate in case a RoR newbie like myself needs a bit more guidance.
I created a folder app\classes and I created a .rb file for my class
I had to create an initialize method to handle some setup
Created a few methods that simple return variables
I made sure I could run the steps in rails console
Created a file in lib\tasks with the code below
Ran this in DOS in the project folder - rake runMe --trace
task :runMe => :environment do
#s = ScrapeTools.new
#bears = #s.getBears
#bulls = #s.getBulls
UserMailer.stock_email(#bears,#bulls).deliver
end
Please let me know if you see any errors
There is. rails runner <path to script> will run the given script under your Rails app. Have some docs
This is a good example of why you don't want to put logic in your controller. Much better than putting that functionality in a controller method, refactor it to a method in a module or class. Then you call that method from your controller as well as from a rake task that is straight-forward to execute in your batch routine.

Rails execute script

I am building a script in on of my controllers to fill a database with an excel files data. I would build the function, then access it through a route. (That i guess i can protect with cancan) But i thought about it, and it doesn't seem very ... 'Railsy'.
I know the scripts folder exists, and it is probably for these kinds of tasks. I've tried googling stuff like 'rails execute script' and other stuff, but i can't find any good advice for what to do next.
I'm sorry if this seems kind of stupid, but in my apps i've been kind of hacking around stuff to make it work, so any advice on this task would be appreciated.
If you need to upload the file in the app and process it, it should probably go in the "lib"directory and be accessed like any other Ruby library/module/etc.
If it's something you need to run locally, "on demand", "scripts" is fine. If you need access to your rails environment when running it like any Rails models, you can run it from "rails console" or "rails runner".
As Aln said, there are a variety of ways it could be scheduled as well.
You could simply do
#!/usr/bin/env ruby
require 'rubygems'
# regular ruby code here
and have it running just like any other util. Of course you can always call any *.rb with simply
ruby somescript.rb
If you need some scheduled script, check into rufus-scheduler gem.

Good place for data loading scripts that rely on rails?

In your experience, where is the best place to place scripts that run data loading jobs, but which rely on rails? In my project they are in the model folder, but that adds a lot of code to the model folder and won't rails load it all into memory when the server is run (unnecessarily)? The lib/ folder looks good, but those don't have rails access unless you manually specify that in the scripts. Any clean solution here?
Are you talking jobs that you fire off via rake? (then tasks/)
Or are you talking putting data into the Rails app, then maybe you want something like the data_migration plugin.
What do you mean by 'data loading jobs'? If they are scripts that manipulate the database, put them in db/.
rake db:seed would be the best imo
put your script in db/seeds.rb

How go about writing standalone Ruby ActiveRecord utility in my current rails project?

I have a RoR project on my Windows 7 PC.
I want to create some Ruby code that I can execute from the cmd.exe command line that manipulates the development database (via database.yml) of the project. (I don't want to have to run my utility code via a web page.)
What is the best way to go about pulling this off? (I'm a newbie.)
I can't put the code in the test/ directory because that executes against the test database.
I tried just creating a utility.rb file under app/ but when I run it I get this:
utility.rb:5: uninitialized constant ActiveRecord (NameError)
My standalone file obviously doesn't know about the rest of the rails framework.
Any suggestions?
Rails comes with a utility to do exactly this. Instead of using ruby filename, use script/runner filename (from within the top-level directory for the Rails project), which will automatically load up your Rails environment before running the script.
However, if what you're trying to do is manipulate the database, the right answer is probably to create a migration. Most people assume that migrations are only for changing the structure of your database (adding or removing columns or tables) but they can also be a great way to add seed data or manipulate all the data in the database.
You can write your own rake task which depends on :environment and pass RAILS_ENV=development when executing it.
Nice screencast about it: screencast

Resources