I have a simple application that allows you to create an account, sign
in, and play a game using an embedded web player on an .rhtml page.
The web player (Unity) is able to call javascript functions on
the .rhtml page. The .rhtml page uses a partial to render a high score
list.
I want to be able to refresh the current high score list based on the
level you are on in the game. The game calls the following JS when a
level is cleared:
<script language="javascript1.1" type="text/javascript">
function loadHighScores(level)
{
//this won't work because the button is invisible in JS and because
level is not accessible to Ruby
//
<% form_remote_tag :url => { :action
=> :update_scores, :id => level } do %>
<%= submit_tag "Refresh Scores for This Level" %>
<% end %>
}
</script>
So is there a way to:
a) pass the JS level variable to Ruby
b) perform the remote call without the user having to press a button;
in other words, only when the JS function loadHighScores is called by
the external game player (I would like to avoid the function
periodically_call_remote if possible)
My apologies if this post belongs in one of the spin-off groups
(AJAX).
Just create an ajax request and allow a parameter to be passed in
<script type="text/javascript">
//<![CDATA[
function update_my_method(a_value) {
new Ajax.Request('/my_controller/my_method/'+a_value,
{asynchronous:true, evalScripts:true})
}
//]]>
</script>
i don't think that there is currently a helper to do this. This
quick and dirty helper (based on javascript_tag and code from
remote_function) will create a simple id value.
def pass_to_remote(options, function_name)
javascript_options = options_for_ajax(options)
function = "function #{function_name}(value){"
function<< "new Ajax.Request("
url_options = options[:url]
url_options = url_options.merge(:escape => false) if
url_options.is_a?(Hash)
function << "'#{url_for(url_options)}/'+value)"
function << ", #{javascript_options}"
function<< "}"
return javascript_tag(function)
end
To use in the view something like.
<%= pass_to_remote({:url=>{:action=>'change_something'}},
'remote_change') %>
will create a javascript function called 'remote_change', only url
option is included, and this should only contain action and
controller.
To test: (obviously you would have javascript code that can call
remote_change directly).
<a href='#' onclick='remote_change(8)'>hello</a>
This works. I have also tried extending the helper to allow a name
for the value to be included so that it appears with that name in the
params. But this is a bit more tricky and I havn't quite got it right
yet, separating the named value and the id value is not quite
straightforward.