views:

22

answers:

2

I have the rake tasks in my rails application. i want to run a commandline commands with in rake task. how can i do this. i tried by the following but fails

desc "Sending the newsletter to all the users"

task :sending_mail do

run "cd #{RAILS_ROOT} && ar_sendmail -o -t NewsLetters -v"

system "cd #{RAILS_ROOT} && ar_sendmail -o -t NewsLetters -v &"

end

The above run command throws run method undefined & System command not throwing any errors but not executed.

i want to do this.. can any please correct me on this. how can defined correctly to run command lind commands

A: 

run is used by Capistrano and other things for launching commands, but Rake often makes use of Kernel#system instead.

Your command might be being run, but not working. Why not make a wrapper shell script you can test independently, or try and kick off using the full path:

newsletter_script = File.expand_path('ar_sendmail', RAILS_ROOT)

if (File.exist?(newsletter_script))
  unless (system(newsletter_script + ' -o -t NewsLetters -v &'))
    STDERR.puts("Script #{newsletter_script} returned error condition")
  end
else
  STDERR.puts("Could not find newsletter sending script #{newsletter_script}")
end

It would seem odd to have your script not in scripts/

The system call should return true on success. If this is not the case, either the script returned an error code, or the command could't be run.

tadman
Hi tadman, Thanks for your answer... i just copied your code and tried but not working as expected..can you please tell me what is File.expand_path do ?
palani
Hello tadman, your script looking for the file Rails_Root/ar_sendmailer. but this is not a file and this is command which invoked from Rails app root folder. like [/home/username/railsapp]$ar_sendmail -o -t NewLetter -V . so i rake file i go the Rails application root folder and trigger the above command that what i need... please help me on this
palani
`File.expand_path` is used to...expand paths, basically. It will properly join two paths together, like appending `ar_sendmail` on your Rails path, whatever that is. It's also good for eliminating things like `../../` when required, giving you the proper, full path.
tadman
You need to know where `ar_sendmail` is otherwise you won't be able to launch it properly. Your shell has a `PATH` which can differ from what Ruby will use, and that can make scripts work even when they're not in the directory you're in.
tadman