【问题标题】:AJAX request can't get instance variable from controller in Rails applicationAJAX 请求无法从 Rails 应用程序中的控制器获取实例变量
【发布时间】:2014-11-01 04:56:48
【问题描述】:

我正在尝试将数据从我的控制器获取到 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,一切正常,但是当我尝试从 before 过滤器传递数据时,页面中没有 id。

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

【问题讨论】:

    标签: javascript jquery ruby-on-rails ajax


    【解决方案1】:

    您的 JS 将无法访问您的 @instance variables除非您从控制器本身调用它们。这里的问题是,如果您正在加载 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")
          }
       });
    });
    

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-11
        • 1970-01-01
        • 2016-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多