How to integrate an already-existing .rb file in Rails? - ruby-on-rails

I am still learning Ruby on Rails, but have a general question about using a link on a Rails view to trigger a ruby program to run. In other words, rather than type "ruby filename.rb" at the command prompt, I want a link in my Rails view to execute the code in filename.rb, when it's clicked.
I know this is a bit of hack, but I'm trying to learn one step at a time...

If you're using Ruby 1.9.x you can use Process.spawn;
Process.spawn("ruby #{Rails.root}/my_ruby_file.rb")

Copy that file in the lib directory and use require "already-existing.rb" in your rails view helper and call the methods from that file in your view .

Related

Configuring Sublime Text 3 for Ruby on Rails development

I am a beginner in this whole thing. I have previously used Sublime for HTML and CSS practice. Now I want to work on a website using Ruby, but do not know how to set up Sublime for rails, since every tutorial for Ruby has those files in the left side of the Sublime window, like App directory and similar generated somehow. I would not like to work blindfolded. I have tried to find a way to generate those directories, but did not find any step by step instructions. Which are welcomed in this case. I would appreciate those, or if there is a link to some detailed tutorial on how to do that. Thanks in advance for any help!
There is a blog that I hope it would help you in your case.
Here it is: Setting up Sublime Text 3 for Rails Development
The directories you're talking about (app, config, etc.) aren't generated by SublimeText; they're generated by Rails when you create a new application with rails new at the command line.
Once you've created the application, you can open the top-level directory in SublimeText, and you'll see all the directories in your sidebar. For example, if you keep your apps in a directory called my_app, and you want to create a Rails app called new_app, you can do this from your terminal:
cd my_apps
rails new new_app
subl new_app
And you should see something like this:
For more on how to get started with Rails, I'd recommend Michael Hartl's Ruby on Rails tutorial.

Add a basic UI layer to existing ruby app

First, I am fairly new to Ruby/RoR and so you'll have to forgive me for any wrong terminology, but hopefully I'll get my point across.
I built an ruby app that I am needing to add an extremely simple UI layer using rails. Read up on a previous post of mine that explains the project thoroughly to give you good an idea of what it does. Specifically take a look at the tree outline that I pasted in so you see the existing file structure for the project.
What I need to know, is how to convert this existing project into a rails app? My experience in building something with rails has always started out with rails new app_name, but never anything like this. Any tips would be appreciated.
I saw your parser script, and it is not a daemon (a program that keeps running indefinitely in the background), right?
If I'm right, then you have several options:
The easiest option
Just build a rails application using rails new app_name, and inside some controller action, make a system call to run your script
class SomeController
def some_action
succeeded = system(:ruby, '/path/to/main.rb', '/path/to/some.txt')
# Do some rendering stuff here based on the result of the system call
end
end
This approach is somehow nasty for me, and it's not performant because each system call reads your ruby script and compiles or interprets it then runs it.
The harder option
Refactor your script so that it's features can be wrapped into a gem.
Then you install that gem, require it in your rails app, and use it.
I saw your original ruby script is almost there, it shouldn't be that hard to make it become a gem.
Rails is just "something" on top of Ruby. Especially, you can use any plain ruby objects inside of Rails, anywhere, and this is nothing unusual (google "PORO").
In your case, I would make a simple Rails app in the way you have mentioned yourself with rails new. Then trivially refactor your existing code until you have a simple, standalone class that does what you need to be done but takes its input/output from simple ruby data structures (i.e., method arguments, return values, no global state, no file operations). Then you can use that class from inside your Rails controller (taking input from a HTML form, rendering output to HTML), and also from inside your script (reading input from a file or STDIN, rendering output to STDOUT).
Where you put that class is up to you. In the MVC paradigm, it is not "C" or "V", and one could argue about whether it's "M". So put it into app/models/ or lib/, whatever you like more.
These were great answers and I'm sure they would have worked perfectly. However, they were a little bit more complex than what I was looking for.
What I ultimately ended up doing was just cd into the directory above where the ruby app was located and then just simply ran rails new app_name. Rails will ask if you'd like to overwrite any files that exist already. From there I just integrated my script into the controller actions and created the views.

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.

Plain old Ruby object location in Rails

Rails n00b question. I am creating a plain old Ruby object in Rails. But I am not sure if there is a standard location in the app that I should put this object.
Thanks
Several choices, but the lib directory is the most common.
If you need to initialize the code, the most common place is config/initializers.
So you might have:
lib/mystuff.rb
and:
config/initializers/mystuff.rb
lib/mystuff.rb
contains your ruby code.
config/initializers/mystuff.rb
contains code that initializes your stuff, whatever Ruby files that are found in config/initializers are run when Rails boots up.

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