javascript - AJAX 请求无法从 Rails 应用程序中的 Controller 获取实例变量

标签 javascript jquery ruby-on-rails ajax

我正在尝试将数据从 Controller 获取到 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请求吗?如果是这样,正确的解决方案是什么?

最佳答案

您的 JS 将无法访问您的 @instance 变量除非您从 Controller 本身调用它们。这里的问题是,如果您加载 ajax 来访问实例变量 - 这根本不起作用。

让我解释一下...


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")
      }
   });
});

关于javascript - AJAX 请求无法从 Rails 应用程序中的 Controller 获取实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25716353/

相关文章:

ruby-on-rails - Rails 3 中 Rake 任务的源代码在哪里?

ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段

javascript - 如何在不选择整行的情况下选择复选框(见正文)?

javascript - 在 cgi.pm 中包含内部 javascript

Javascript 使用 foreach 函数添加新行

Javascript ForEach 函数在 IE 中不起作用

javascript - 想要播放音频并且应该在 10 秒后在 Html 和 javascript 中停止?

javascript - 单击 "Submit"或 "Close"后如何关闭 JIRA 问题收集器窗口

javascript - 通过一次提交提交多个表单

ruby-on-rails - ActiveRecord 查询中的 “includes” 和 “preload” 有什么区别?