从javascript发布到ruby

时间:2015-10-18 01:05:04

标签: javascript ruby-on-rails ruby ajax

所以我在视图上有这段代码:

var variable_test = 'begin';
$.ajax({
  url : "/controller/index",
  type : "post",
  data : variable_test
}).done(function(response) {
  alert('1');
})
    .fail(function (error) {
    alert('2');
});

var eia = <%= @variable.to_json.html_safe %>;
alert(eia);

在控制器上我有这个:

def index
   @someVariable = 'end'
   @variable = params[:variable_test]
end

执行时这将是结果:

带有1的

对话框消息(所以它应该已经工作并发布了一些东西)

带有null的

对话框消息

这是服务器端POST请求:

Started POST ...  
Processing by Controller#index as */*  
Parameters: {"begin"=>nil}  
...  
...  
Current user: anonymous  
...  
Completed 200 OK... 

那有什么不对?它实际上是将变量variable_test发布到控制器variable吗?如果是,为什么它将其读为空?如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

它会在帖子中发送您的价值。问题是data将对象作为值,因此如果要将服务器端的值读为params[: variable_test],则需要进行ajax调用

var variable_test = 'begin';
$.ajax({
  url : "/controller/index",
  type : "post",
  data : { variable_test: variable_test },
}).done(function(response) {
  alert('1');
}).fail(function (error) {
  alert('2');
});

另一方面,我不确定你要完成什么,你拥有的索引操作将尝试渲染你在app / views / controller /下的index.html.erb文件,是是否在ajax请求中调用了相同的索引操作?

很抱歉没有评论,没有足够的声誉。

答案 1 :(得分:1)

这种方式非常简单。

您的Ajax 似乎将您的请求发送给您的控制器:

Started POST ...
Processing by Controller#index as */*
Parameters: {"begin"=>nil}

......这是你的反应,没有被抓住......

#app/assets/javascripts/application.js
$.ajax({
  url : "/controller/index",
  type : "post",
  data : {serialized: "data"}, // data should be serialized
}).done(function(response) {
  alert('1');
}).fail(function (error) {
    alert('2');
});

此设置触发alert('1')功能。

处理回应是你不满意的地方:

<强> 1。 ERB在资产管道中不起作用

#app/assets/javascripts/application.js
var eia = <%= @variable.to_json.html_safe %>; // won't work
alert(eia); // won't work

这将工作。

将使用ajax .done方法中返回的数据:

#app/controllers/controller_controller.rb
class ControllerController < ApplicationController
   def index
      @variable = {}
      @variable.attribute = "test"
      respond_to do |format|
         format.json { render json: @variable }
      end
   end
end

#app/assets/javascripts/application.js
$.ajax({
  url : "/controller/index",
  type : "post",
  data : {serialized: "data"}, // data should be serialized
}).done(function(response) {
   json = JSON.parse(response);  
   alert(json.attribute)
}).fail(function (error) {
    alert('2');
});

这应该返回数据,允许您将其输出到视图

-

<强> 2。使用服务器端JS

除了ERB在前端不起作用的事实之外,你还必须看看你的JS是如何被调用的。

你必须记住JS是前端;它没有任何访问您的Ruby变量的权限。因此,如果您尝试访问视图中返回的数据, 需要从服务器捕获响应(#1),运行服务器端JS喜欢这样:

#app/controllers/controller_controller.rb
class ControllerController < ApplicationController
   def index
      respond_to do |format| 
         format.js #-> calls app/views/controller/index.js.erb
      end 
   end
end

每当您运行index.js.erb操作时,这将调用index - 允许您使用您在Ruby中定义的任何数据:

#app/views/controller/index.js.erb
var eia = <%= @variable.to_json.html_safe %>;
alert(eia);

这也必须与删除前端ajax中的响应挂钩同时发生:

#app/assets/javascripts/application.js
$.ajax({
  url : "/controller/index",
  type : "post",
  data : {serialized: "data"}, // data should be serialized
});