3

I am trying to execute a Ruby method in my application_controller.rb from a button in my view. In a post yesterday, someone told me to use an Ajax call to do so because, without it, would just run on page load.

I'm very new to this and I have a hard time understanding it.

I installed the rails-Ajax gem, and it is added to my Gem file.

I followed "Integrate Ajax capabilities to Rails websites with history, bookmarking, partial refreshes, Rails flashes, user callbacks, scripts execution, redirections." untill step 5.

I just don't know what to do it next.

Here is my current configuration. The method only runs on page load:

My view:

<td><button type="button" onclick="executeit()" class="btn btn- default">executer</button></td>

<script>
function executeit() {
 var selectingCommand = document.getElementById("CommandSelect");
 var selectedCommand = selectingCommand.options[selectingCommand.selectedIndex].text;
 var selectingServer = document.getElementById("serverlist");
 var selectedServer = selectingServer.options[selectingServer.selectedIndex].text;
 var username=document.getElementById("login").text;
 var password=document.getElementById("password").text;



<%execute%>;

}
</script>

My method in application_controller.rb :

def execute
  require 'rubygems'
  require 'net/ssh'

  @hostname = "smtlmon02"
  @username = "test"
  @password = "1234"
  @cmd = "ls -al"
  @cmd2 = "sudo su - -c 'ls;date'"
  @cmd3 = "ls -alrt"

  ssh = Net::SSH.start(@hostname, @username, :password => @password)
  res = ssh.exec!(@cmd)
  res2 = ssh.exec!(@cmd2)

  ssh.close
  puts res2

end

It would be fantastic if anyone could explain how to do it!

the Tin Man
  • 158,662
  • 42
  • 215
  • 303
Guillaume Caillé
  • 393
  • 2
  • 6
  • 20

2 Answers2

12

I am not sure I see your goal completely, however, if you just want to call a controller action when clicking on your button, I would approach it like this:

Here the HTML:

<a href='#' id='executer-button' class='btn btn-default'>Executer</a>

You should place this in you app/assets/javascripts/execute_caller.js:

//This function calls the "execute" controller action, using its route and also
//passes a "selectingCommand" variable to it
var callExecuter=function(){
  $.ajax({
    type:'GET',
    url:'/executer_route',
    data: { selectingCommand : document.getElementById("CommandSelect"); 
          },
    success:function(){
      //I assume you want to do something on controller action execution success?
      $(this).addClass('done');
    }
  });
}

$(document).on("click","#executer-button",callExecuter);

Then:

  1. Check your rake routes to see which is the appropiate route to the controller action execute.
  2. Replace it in the url field of the $.ajax(...) function.
  3. Assuming you have either debuggeror pry gem, write debugger inside your def execute action controller, to make sure you reach there via ajax.
  4. Edit your on success action in the ajax call accordingly, so it does what you want it to do.
lllllll
  • 4,715
  • 6
  • 29
  • 42
  • What does the `data:`-line do? Is it necessary? I'm working on a pretty similar problem. – Saggex Apr 03 '14 at 06:03
  • Can I somehow pass information to it? Like `this.getAttribute('w_id');` – Saggex Apr 03 '14 at 06:14
  • 1
    that is exactly what `data:` does, it's used to attach data to the request, in the example I'm sending `document.getElementById("CommandSelect")` as `selectingCommand` variable, which will be present in `params[:selectionCommand]` inside the controller. Also I recommend you to start a new question even if the issue is similar ;) – lllllll Apr 03 '14 at 11:35
  • As much as I appreciate the answer, 'execute' as sample controller name is melting mind of a reader here... Why not something actually meaningful? –  Mar 21 '15 at 23:25
-1

If you are using jQuery, you could add this:

$("button").on("click", function(){
    $.ajax({
        url: "test.html",
        context: document.body
    }).done(
        function() {
            $( this ).addClass( "done" );
        }
    );
});
random_user_name
  • 25,694
  • 7
  • 76
  • 115
Saravanan
  • 13
  • 1