params可以从Rails应用程序控制器传递到Javascript吗?

时间:2016-01-19 03:34:33

标签: javascript ruby-on-rails

我目前正在将一个单独的对象(a:类别值)传递给我的Rails项目中的params。

我很难理解 - 并且无法从文档中确认 - 应用程序控制器是否适用于应用程序中的所有文件(包括我的javascript文件) )或者如果那只能控制我的观点。

简而言之,我的问题是:在我的Javascript中,我可以使用我的App Controller中的方法传递params,就像我在视图中一样吗?

以下是现在的工作原理:我的application_controller.rb包含了这个set_category方法:

 def set_category
    session[:category] = params[:category] if params[:category].present?
  end

在我看来,这允许我将一个类别传递给我可以在链接中指定的参数。这是一个如何使用link_to帮助程序来实现此功能的示例。

 <%= link_to "Play Game".html_safe, game_path(category: 'game'), class: "btn btn-primary btn-md" %>

太棒了,所以类别“游戏”正在被传递给params,它起作用了。

在加载“游戏”参数的页面上,播放一个javascript游戏。在游戏结束时,我希望能够在链接中(在JS中)再次为param设置一个类别。现在,我正在使用静态链接:

 Game.prototype.finish = function() {
   window.clearInterval(this.interval);
   this.container.html('Your score was ' + this.score + ' correct out of ' + (this.quizCurrent - 1) + ' questions.<br>
   <br>Now see if you won the <a href="/scoreboard">Scoreboard</a><br>');
  }

如果我在Javascript文件中保留此链接,是否可以通过添加类似我使用link_to方法的类别来使其动态化?将其更改为以下内容并未触发该方法:

  <a href="/scoreboard(category: 'game')">Scoreboard</a>

2 个答案:

答案 0 :(得分:1)

我接受了之前的回答,我相信这三种方法都可以解决问题。我想详细说明我做了什么,万一有人遇到这个问题。

选择策略#3,我在我的html视图中添加了一个div来隐藏动态内容:

<!-- hide dynamic content --> 
<%= content_tag :div, class: "temp_information", data: {temp:    game_path(category: "game1")} do %>
 <% end %>

在我的javascript文件中,我然后定义了临时数据,因此我可以在我的链接中调用它(在本例中为params),该链接也在javascript文件中。

 var para = $('.temp_information').data('temp');
  console.log(para); 

控制台确认javascript正在从html文件中提取类别参数,我们很高兴。我的最后一步是将变量放在表达式中:

 this.container.html('Your score was ' + this.score + ' correct out of ' + (this.quizCurrent - 1) + ' questions.<br>
 <br>Now see if you were winner in the' + '<a style= href="' + para + '"> Scoreboard</a>' + ' for this game.');

它有效。

答案 1 :(得分:0)

如果我理解正确,您希望在运行时将ruby脚本中的一些信息传递给javascript。你有两个选择:a)在js中解析你的参数,或者b)通过编写js代码将一些东西传递给javascript。我们来看两个选项。

第一个实际上非常简单。如果您有/scoreboard?category=games,则可以使用location.search查看此内容。有关如何解析数据的更多信息,请参见How do I parse a URL query parameters, in Javascript?。我不会详细介绍,但使用URL传递这些数据非常容易。

第二种选择有点棘手,主要是因为有很多方法可以做到这一点。您可以通过实际编写javascript将数据传递给window对象。例如:

<head>
...
<script>
window.categoryId = '<%= @category.id %>';
</script>
</head>
...

如果您需要传递大量数据,还可以将大量数据转换为JSON。您还可以使用HTML中的data属性传递数据。以下是Rails中的示例:

<%= content_tag :div, data: {data: @data} ... %>

您可以阅读有关此Rails: pass data to javascript的更多信息。

我的建议是保持简单并使用第一个。如果您的数据只是ID或简单查询,则可以执行此操作。如果您的数据很复杂,那么您将不得不使用后面的一些选项。