使用Jquery将Javascript变量发送到Rails 3控制器

时间:2011-08-15 22:29:42

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

我正在使用Rails 3,Jquery-UJS和Jquery。我有一个Jquery与Rails3的工作设置。我试图通过点击一个链接从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暂时移动POST操作(虽然POST参数msg设置正确)。响应是 - $(“#show_message”)。html(“”)

我的.js视图是:

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

EDIT2:当我查看Firebug时,它显示现在有两个动作: 1. POST / jmsg - 响应@message =“你好世界” 2. GET / jmsg - 带有响应@ message =“”

3 个答案:

答案 0 :(得分:1)

当我想从控制器获取任何值时,我总是通过做类似的事情来使用json格式。

// jmsg.js.erb

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

// yourjs.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 =&gt;真的

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

答案 1 :(得分:0)

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

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

});

答案 2 :(得分:0)

好的,我会以一种不引人注目的方式与您分享我在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

如果这对您有用,请告诉我。对于类似的案例,类似的代码对我有用。感谢。