【问题标题】:AJAX Response Rails 4 Does Not Return In Text FieldAJAX 响应 Rails 4 不在文本字段中返回
【发布时间】:2014-12-31 02:56:35
【问题描述】:

我刚开始在 Rails 4 中编码,所以我可能需要非常具体的指导。我正在使用 AJAX 从文本字段中获取用户输入,对其进行修改(为简单起见,我只是在其末尾添加“耶!”),然后将响应作为字符串返回到文本字段。

我相信我正确地发送了我的 AJAX 请求,但我的控制器或视图中的某些内容没有修改或显示结果。

这是我的代码:

查看(solve.html.erb):

<head>
    <script>
        function myFunction() {
            var xmlhttp = new XMLHttpRequest();
            var url = "solve";
            var params = "field1=" + document.getElementById("field1").value;

            xmlhttp.onreadystatechange=function() {
                if (xmlhttp.readyState==4 && xmlhttp.status==200) {
                    document.getElementById("field1").innerHTML=xmlhttp.responseText;
                }
            }

            xmlhttp.open("GET", url + "?" + params, true);
            xmlhttp.send();
        }
    </script>
</head>

<h1>Solve!</h1>
<p>Type it in, type it in.</p>

      <div class="col-lg-6">
        <div class="input-group">
          <input id="field1" type="text" class="form-control" placeholder="1+1">
          <span class="input-group-btn">
            <button class="btn btn-default" type="button" onclick="myFunction()">Solve</button>
          </span>
        </div>
      </div>

路线(routes.rb):

resources :equations
#rest of my routes code
get 'solve' => 'equations#solve'

控制器(equations_controller.rb):

class EquationsController < ApplicationController
  def solve
     if request.post? 
        new_var = params[:field1]
        other_var = "#{new_var} yay!"
        return other_var
    end
  end
end

如果您有任何问题,我会尽快回复您。非常感谢你的帮助!任何事情都非常感谢。

【问题讨论】:

  • 你已经标记了 jQuery,但是在整个 sn-p 中看不到 jQUery 代码
  • 我很抱歉!感谢您指出我的错误,以后我一定会仔细检查。

标签: ruby-on-rails ajax ruby-on-rails-4


【解决方案1】:

您正在发出 GET 请求,但在您的 EquationsController#solve 方法中检查请求是否为 POST。更新控制器代码如下:

class EquationsController < ApplicationController
  def solve
     if request.get?                   # Change to `request.get?`
        new_var = params[:field1]
        other_var = "#{new_var} yay!"
        return other_var
    end
  end
end

那么第二个问题是,您应该编写输出而不是从控制器返回它。正如您所期望的text/plain mime 类型,您应该改为呈现文本:

class EquationsController < ApplicationController
  def solve
     if request.get? 
        new_var = params[:field1]
        other_var = "#{new_var} yay!"
        render plain: other_var         # Change to `render plain: other_var`
    end
  end
end

然而,这不是在 Rails 中处理 AJAX 请求/响应的推荐方式。请参考:Working with JavaScript in Rails。另外,请参阅The response object 了解更多详情。

【讨论】:

  • 我进行了您的两项更改,但是当我转到我的 /solve 页面时,它呈现“耶!”文本和屏幕的其余部分是空白的。你的第一个链接的哪一部分是可以帮助我完成我想要做的事情的部分?只是不确定。非常感谢!
  • 我强烈建议您浏览第一个链接所引用的页面。请参阅2.2.7 渲染文本部分,其中解释了如何在Layouts and Rendering in Rails 中包含布局。
  • 对于仅渲染yay! 的问题,您能否确保您的params 哈希实际上包含密钥:field1。您可以在日志文件中检查这一点,或者在 if 语句之后使用 Rails.logger.debug { params } 检查哈希以进行调试。
【解决方案2】:

在 myFunction() 中试试这个

if (xmlhttp.readyState==4 && xmlhttp.status==200) {
         document.getElementById("field1").value = xmlhttp.responseText;
       }

我认为这可行

【讨论】:

  • 我之前尝试过并再次测试了一次以确保安全,但它只是将页面的所有 html 拉到文本字段中。感谢您的帮助!
【解决方案3】:

好的,我认为控制器的操作是呈现默认的“solve.html.erb”视图。所以你应该只返回你想要的值

class EquationsController < ApplicationController
  def solve
     if request.post? 
        new_var = params[:field1]
        other_var = "#{new_var} yay!"
        render html: other_var
    end
  end
end

在js中

if (xmlhttp.readyState==4 && xmlhttp.status==200) {
         document.getElementById("field1").value = xmlhttp.responseText;
       }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    相关资源
    最近更新 更多