【问题标题】:How to pass javascript variable to rails partial view如何将javascript变量传递给rails局部视图
【发布时间】:2016-08-26 07:00:07
【问题描述】:

我遇到了一种情况,我需要将一个 Javascript 变量传递给 rails 局部视图。

例如在 test.html.erb

<script type="text/javascript">
var array  =  <%= raw sort_section %>
    for(i = 0; i < array.length; i++) {
        $('#test').append("<%= j render :partial => 'section_in_panel', :locals => {:section => raw array[i]} %>");
    }
</script>

但它总是抛出语法错误,我尝试了很多方法,比如

{:section => j sort_section_js[i]} %>"
{:section =>" + sort_section_js[i] + "}%>"

我需要使用它,因为我想调用ajax 来动态更改array

更新

所以,也许我需要写一个控制器

def get_new_variable
    ...
    return new_variable
end 

然后在test.html.erb

<script>
$('test').onclick(function(event) {
   //write some ajax call
   //get new_variable
   $('#test').empty();
   $('#test').append("<%= j render :partial => 'section_in_panel', :locals => {:section => raw new_variable} %>");
  });
)</script>

方向对吗?

【问题讨论】:

  • sort_section_js 持有什么?
  • 它包含一个嵌套数组,抱歉我忘记更改变量名了。
  • 在 ruby​​ 将视图渲染到服务器后,Javascript 在客户端运行,那么您无法将 javascript 变量的值传递给 rails 部分视图。
  • 我明白了,所以唯一的办法就是写一个新的控制器来获取新的变量,然后将新的变量传递给局部视图?

标签: javascript ruby-on-rails


【解决方案1】:

正如 Alberto Juan 在评论中所写,您不能在 ruby​​ 代码中使用 javascript 变量。 Ruby 代码会在 javascript 之前被解释,并且不会知道 i 是什么。

更新:您的更新将无法正常工作,因为您在 javascript 代码中使用了 new_variable。

要在 ajax 调用后使用 partial,请按照此 link

中的说明进行操作

示例:

items/index.html.erb

<div class="grid">
  <% @categories.each do |cat| %>
    <%= link_to cat.name, fetch_items_path(:cat_id => cat.id), :remote => true %>
  <% end %>

  <%= render partial: 'item_grid', locals: { items: @items} %>
</div>

routes.rb

get "/fetch_items" => 'items#from_category', as: 'fetch_items'

items_controller.rb

def index
    @items = Item.all
    @categories = Category.all
end

def from_category
    @selected = Item.where(:category_id => params[:cat_id])
    respond_to do |format|
        format.js
    end
end

views/items/from_category.js.erb

$("#items_grid").html("<%= escape_javascript(render partial: 'items_list', locals: { items: @selected } ) %>");  

【讨论】:

  • 很好的做法!在我做了这个小小的练习之后,我找到了完成我的项目的正确方向。谢谢!
【解决方案2】:

您可以使用 gem gon 或简单地执行以下操作:

<script>
  MyVars[:someVar] = <%= some_value %>;
</script>

但是,我建议您将后端代码与前端代码分开,并使用 JSON 将数据传递给 JS。

【讨论】:

  • 但这是另一个方向。他们想从 JS 传递数据。
  • 是的。这是我的失败。
猜你喜欢
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多