Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用AJAX将参数传递给Rails控制器_Javascript_Jquery_Ruby On Rails_Ajax_Model View Controller - Fatal编程技术网

Javascript 使用AJAX将参数传递给Rails控制器

Javascript 使用AJAX将参数传递给Rails控制器,javascript,jquery,ruby-on-rails,ajax,model-view-controller,Javascript,Jquery,Ruby On Rails,Ajax,Model View Controller,我想从我的JavaScript代码向RubyonRails中的ShowAction发送一个post请求,其中包含我想存储在实例变量中的数据,这样我就可以将其保存在视图中的表单上并上传到服务器 正如您在下面看到的,参数'base64'显示在我的rails日志中,但是当我尝试在视图中调用@base64时,在获取控制器中的值后,它是nil 任何建议都将不胜感激,谢谢 查看 var full_base64 = "data:image/jpeg;base64," + base64;

我想从我的JavaScript代码向RubyonRails中的ShowAction发送一个post请求,其中包含我想存储在实例变量中的数据,这样我就可以将其保存在视图中的表单上并上传到服务器

正如您在下面看到的,参数'base64'显示在我的rails日志中,但是当我尝试在视图中调用@base64时,在获取控制器中的值后,它是nil

任何建议都将不胜感激,谢谢

查看

var full_base64 =  "data:image/jpeg;base64," + base64;

                $.ajax({
                    data: 'base64=' + full_base64,
                    type: 'POST',
                    url: "/videos/show/<%=@video.id%>"
                });
路线

post'videos/show/:id',至:'videos#show'

Rails服务器日志:

Started POST "/videos/show/1" for 127.0.0.1 at 2020-01-22 12:59:40 -0600
Processing by VideosController#show as */*
Parameters: {"base64"=>"data:image/jpeg;base64,iV...
...
, "id"=>"1"}
控制台

>> 

@base64
=> nil
>> 

如果我理解正确,您正试图将AJAX传递给控制器中的
show
操作。这是一个非常笼统的答案,因为您没有包含任何HTML代码,而且似乎没有启动AJAX的按钮。但我会尽力为你指出正确的方向。您需要按照以下基本思路做一些事情:

var full_base64 =  "data:image/jpeg;base64," + base64;

            $.ajax({
                data: 'base64=' + full_base64,      
                type: 'POST',
                url: "/videos/my_ajax_upload"
            });
这会将您的AJAX调用发送到我调用的控制器方法
my\u AJAX\u upload
,但您可以随意调用它。在控制器中,您需要类似以下内容:

def my_ajax_upload
  @video.update(base_64: params[:base64])
  respond_to do |format|
    format.js {render :action => "base_64_response" }
  end
end 
$('#pic_upload').html('<%= escape_javascript(render :partial => 'base_64_response') %>');
这通过保存发送到DB的参数来响应初始AJAX调用,并通过调用名为
base_64_response.js.erb的文件来响应,该文件可能类似于:

def my_ajax_upload
  @video.update(base_64: params[:base64])
  respond_to do |format|
    format.js {render :action => "base_64_response" }
  end
end 
$('#pic_upload').html('<%= escape_javascript(render :partial => 'base_64_response') %>');
循环是
加载页面
->
采取措施触发对控制器方法的AJAX调用
->
使用控制器方法处理AJAX调用
->
呈现JS文件
->
JS文件将页面中的div替换为新的html


您可能需要进一步了解AJAX在Rails中的工作原理。如果我正确理解您正试图将AJAX传递给控制器中的
show
操作,此RailsCast可能会有所帮助。这是一个非常笼统的答案,因为您没有包含任何HTML代码,而且似乎没有启动AJAX的按钮。但我会尽力为你指出正确的方向。您需要按照以下基本思路做一些事情:

var full_base64 =  "data:image/jpeg;base64," + base64;

            $.ajax({
                data: 'base64=' + full_base64,      
                type: 'POST',
                url: "/videos/my_ajax_upload"
            });
这会将您的AJAX调用发送到我调用的控制器方法
my\u AJAX\u upload
,但您可以随意调用它。在控制器中,您需要类似以下内容:

def my_ajax_upload
  @video.update(base_64: params[:base64])
  respond_to do |format|
    format.js {render :action => "base_64_response" }
  end
end 
$('#pic_upload').html('<%= escape_javascript(render :partial => 'base_64_response') %>');
这通过保存发送到DB的参数来响应初始AJAX调用,并通过调用名为
base_64_response.js.erb的文件来响应,该文件可能类似于:

def my_ajax_upload
  @video.update(base_64: params[:base64])
  respond_to do |format|
    format.js {render :action => "base_64_response" }
  end
end 
$('#pic_upload').html('<%= escape_javascript(render :partial => 'base_64_response') %>');
循环是
加载页面
->
采取措施触发对控制器方法的AJAX调用
->
使用控制器方法处理AJAX调用
->
呈现JS文件
->
JS文件将页面中的div替换为新的html


您可能需要进一步了解AJAX在Rails中的工作原理。这个RailsCast可能会有帮助,仅供参考-如果您没有明确定义内容类型,我还注意到Rails中有一些奇怪的东西。在您发布的示例中,您没有声明contentType,因此它可能正在解析nil。发布base 64数据时,可以将内容类型指定为:

               $.ajax({
                    data: 'base64=' + full_base64,
                    type: 'POST',
                    contentType: 'application/octet-stream'
                    url: "/videos/show/<%=@video.id%>"
                });
$.ajax({
数据:“base64=”+full_base64,
键入:“POST”,
contentType:“应用程序/八位字节流”
url:“/videos/show/”
});
它可能会改变控制器对身体的解析


仅供参考-如果不明确定义内容类型,我还注意到Rails中有一些奇怪的东西。在您发布的示例中,您没有声明contentType,因此它可能正在解析nil。发布base 64数据时,可以将内容类型指定为:

               $.ajax({
                    data: 'base64=' + full_base64,
                    type: 'POST',
                    contentType: 'application/octet-stream'
                    url: "/videos/show/<%=@video.id%>"
                });
$.ajax({
数据:“base64=”+full_base64,
键入:“POST”,
contentType:“应用程序/八位字节流”
url:“/videos/show/”
});
它可能会改变控制器对身体的解析

仅使用字符串而不是符号作为散列键

if params["base64"].present?
  @base64 = params["base64"]
end
只需使用字符串而不是符号作为散列键

if params["base64"].present?
  @base64 = params["base64"]
end

“在视野中”是什么意思?您何时/从何处尝试在控制台中访问它?因为这是AJAX,所以我认为我们需要知道这里的时间轴流。加载视图,然后通过AJAX发送值?然后是否使用新数据刷新部分视图?仅仅因为您通过AJAX将其发送给控制器并不意味着它会更新当前页面上的任何内容。因此,我尝试将JavaScript变量上载到我的rails服务器。在我的视图(html)中,画布中有一个图像,我将其转换为base64。我想以某种方式将其存储在Ruby变量中,以便将其作为图像上传到服务器。我在网上搜索,普遍的共识是使用AJAX,但它对我不起作用。我只是在web浏览器的调试控制台中回显它。@Beartech我加载视图,然后通过AJAX发送它。我没有刷新视图。您是通过AJAX发布到您已经看到的视图。如果你想使用AJAX,你需要遵循一定的流程。您需要在控制器中创建一个接受该信息的方法,然后使用该信息执行某些操作。然后它应该发回一个AJAX响应,更新发送它的页面的某些部分,让您知道它是有效的?您何时/从何处尝试在控制台中访问它?因为这是AJAX,所以我认为我们需要知道这里的时间轴流。加载视图,然后通过AJAX发送值?然后是否使用新数据刷新部分视图?仅仅因为您通过AJAX将其发送给控制器并不意味着它会更新当前页面上的任何内容。因此,我尝试将JavaScript变量上载到我的rails服务器。在我的视图(html)中,画布中有一个图像,我将其转换为base64。我想以某种方式将其存储在Ruby变量中,以便将其作为图像上传到我的服务器