AJAX请求无法从Rails应用程序中的控制器获取实例变量

时间:2014-09-08 01:36:25

标签: javascript jquery ruby-on-rails ajax

我试图将我的控制器中的数据导入rails应用程序中的javascript文件。 html使用select选项和组织id作为参数立即调用ajax请求。

在before_filter中我有

def set_org_id
    if params[:id].present?
        @org_id = klass.find(params[:id]).id
    else
        @org_id = 0
    end
end

在js文件中我有:

$.ajax({ url: "/admin/analytics/filter",
        type: 'GET',
        data: {
          time_frame: selectedId,
          organization_id: <%= @org_id %>
        }
})

如果我将一个数字硬编码为organization_id,一切正常,但当我尝试从前一个过滤器传递数据时,我最终在页面中没有id。

我应该补充一点,索引路由是admin / analytics /。过滤器操作是admin / analytics / filter。用户从不导航到该页面,只有ajax命中过滤器路径才能获得相关数据。这可能是在设置实例变量之前发送ajax请求吗?如果是这样,那么适当的解决方案是什么?

2 个答案:

答案 0 :(得分:3)

您的JS将无法访问您的@instance variables ,除非您从控制器本身调用它们。这里的问题是,如果您正在加载ajax来访问实例varialbe - 这根本不起作用。

让我解释一下......


<强> JS

Javascript被称为客户端语言 - 这意味着它使您能够访问HTML / DOM中的元素而相对不受惩罚。这里的问题是Rails / Ruby,就像PHP一样,是服务器端,因此只能向浏览器提供呈现的数据

这意味着调用以下内容将无效:

data: {
   time_frame: selectedId,
   organization_id: <%= @org_id %>
}

正如所解释的,原因是您无法从Javascript访问@org_id。首先,你不知道是否会设置@org_id变量(如果你想使用Rails助手),其次,你的JS无论如何都无法访问变量(因为它是Rails)

-

<强>修正

最纯粹的解决方法是以某种方式在DOM中创建所需的数据。我从你的回答中看到你为你的表单设置了一个隐藏的字段。更好的方法是set an HTML5 "data" attribute使用id

你最好这样做:

<%= form_tag route_path, data: { org_id: @org_id } %>

这将使您能够致电:

$(document).on("submit", "form", function(){
   $.ajax({
      ...
      data: {
        time_frame: selectedId,
        organization_id: $(this).data("org_id")
      }
   });
});

答案 1 :(得分:0)

我能够通过将数据传递到html.erb页面中的隐藏字段来解决这个问题。

<%= hidden_field_tag('org_id', @org_id) %>

然后在javascript中通过选择器引用数据。

organization_id: $('#org_id').val()

我不喜欢这个,但至少它有效。