【问题标题】:Sending Javascript variable to Rails 3 controller using Jquery使用 Jquery 将 Javascript 变量发送到 Rails 3 控制器
【发布时间】:2011-08-15 22:29:41
【问题描述】:

我正在使用 Rails 3、Jquery-UJS 和 Jquery。我有一个使用 Rails3 的 Jquery 工作设置。我正在尝试通过单击链接将变量从 Javascript 发送到 Rails 控制器。

我目前的方法是使用js如下进行ajax调用并传递msg字符串。

$("#select_link").click(function() 
{$.ajax({
type: 'POST',
url: 'http://your_url/jmsg',
data: {msg: "hello world"},
;}
});
});

我应该在我的 application.js 文件中包含此代码吗?

在我的 .html.erb 文件中

<%= link_to "Send variable", jmsg_path, :remote => true %>

在我的控制器中

def jmsg
@message= params[:msg]
respond_to do |format|
format.js
end
end

到目前为止,我还无法在我的@message 实例变量中获取 javascript 变量

编辑:

我按照建议进行了更改。但是,当我这样做时,变量@message 没有设置

  @message=params[:msg]

当我使用 Fiebug 检查 XHR 时,我看到 302 Moved Temporarily for the POST 操作(尽管 POST 参数 msg 设置正确)。响应是 - $("#show_message").html("")

我的 .js 视图是:

 $("#show_message").html("<%= @message %>")

EDIT2:当我检查 Firebug 时,它显示现在有两个操作: 1. POST /jmsg - 响应 @message = "hello world" 2. GET /jmsg - 带有响应 @message=" "

【问题讨论】:

    标签: jquery ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    当我想从控制器获取任何值时,我总是使用 json 格式来做这些事情。

    // jmsg.js.erb

    {
      "message": "<%= @message %>"
    }
    

    // 你的js.js

    $.ajaxSetup({
      'beforeSend': function(xhr) { xhr.setRequestHeader("Accept", "text/javascript") }
    });
    
    $("#select_link").click(function(){
      $.ajax({
        type: 'POST',
        url: 'http://your_url/jmsg',
        dataType: 'json',
        data: {msg: "hello world"},
        success: function(json, status, xhr){
          // $("#show_message").html(json.message)
        }
      });
    });
    

    // 在 your.html.erb 中,移除 :remote => true

    <%= link_to "Send variable", jmsg_path %>
    

    【讨论】:

    • 谢谢! data : {msg: "hello world"} 给出带有 msg 参数和值 "hello world" 的 POST(在 Firebug 中检查过)。我仍然无法设置变量@消息(用更多信息编辑了我上面的问题)
    • 谢谢!使用 POST /jmsg 接收 Json 数据(使用 Firebug 检查)。但是,@message 变量没有保留,因为由于控制器中的重定向 html 选项,我得到了 GET /jmsg。 (无状态控制器)。我怎样才能避免这种情况? (我意识到保存在数据库中是一种解决方案)
    • AFAIK,控制器中的重定向 html 选项仅呈现目标视图。重定向不会处理控制器内目标操作中的任何代码。例如,您在操作jmsg 中声明@message = "something"。内部操作 another_action 在您放置 redirect_to :action =&gt; "jmsg" 的同一控制器中。除非您在 another_action 中声明 @message = "something",否则您永远不会在 jmsg.js.erb 上获得 @message。
    • 我删除了重定向。在编辑 2 中添加了更多信息 - 我仍然可以同时获得 POST 和 GET 操作。
    【解决方案2】:

    将以下代码添加到您的应用程序 js 中并尝试一下

    $(function(){
        $("#select_link").click(function(){
           $.ajax({
            type: 'POST',
            url: 'http://your_url/jmsg',
            data: { msg: "hello world" },
           });
        });
    
    });
    

    【讨论】:

    • 感谢您的回复和帮助。我仍然无法设置@message 实例变量,并且在我的 .js 视图中看不到任何内容。我编辑了我的问题以添加更多信息。
    • 你把这行$("#show_message").html("&lt;%= @message %&gt;")放在哪里?
    • 那行是我的 format.js 文件 (jmsg.js)。请参考我的控制器代码。我首先得到 POST /jmsg,然后 format.js 由 GET /jmsg 执行和重定向。所以@message 变量不会被持久化。
    【解决方案3】:

    好的,我会以一种不引人注目的方式与你分享我对在 Rails 中使用 AJAX 和 jQuery 的了解:

    首先,将其包含在 application.js 文件的开头

    jQuery.ajaxSetup({
      'beforeSend': function(xhr) { xhr.setRequestHeader("Accept", "text/javascript") }
    });
    

    然后,在同一个文件中,如下创建一个函数,其中是在 DOM 加载之前加载的函数。在这个函数中,您可以编写自己的函数:

    $(function() {
       $("#select_link").sendVar();
    }
    
    jQuery.fn.sendVar = function(){
        this.click( function() {
        var msg= 'hello world';
           $.post('/your_url/jmsg/' + msg, function(data){
    
            })
           return false;
        });
    }
    

    确保您的 routes.config 文件中有此发布请求的路由,例如

    match 'your_url/jmsg/:msg', :controller => 'your_url', :action => 'jmsg', :via => :post
    

    让我知道这是否适合您。对于类似的情况,类似的代码对我有用。谢谢。

    【讨论】:

    • 感谢您的回复。您的代码正在执行 POST 操作并发送 msg 变量。我正在做类似的事情。好像还有别的问题。由于控制器是无状态的,可能@message = params[:msg] 无效?
    • params[:msg] 完全有效。您的代码也在执行 POST。你试过我的代码吗?所有这些,包括在 routes.rb 文件中包含路线。这应该有效。
    猜你喜欢
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多