繁体   English   中英

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

[英]Issue passing parameter to Rails controller using AJAX

我想从我的 JavaScript 代码向我在 Ruby on Rails 中的 show 操作发送一个 post 请求,其中包含我想要存储在实例变量中的数据,以便我可以将其保存在我视图中的表单上并将其上传到我的服务器.

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

任何建议表示赞赏,谢谢!

看法

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

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

控制器

    def show
        @video = Video.find(params[:id])
        if params[:base64].present?
            @base64 = params[:base64]
        end
    end

路线

post 'videos/show/:id', to: '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_ajax_upload的控制器方法,但您可以随意调用它。 在您的控制器中,您需要类似的东西:

def my_ajax_upload
  @video.update(base_64: params[:base64])
  respond_to do |format|
    format.js {render :action => "base_64_response" }
  end
end 

这通过保存您发送到数据库的参数并通过调用名为base_64_response.js.erb的文件进行回复来响应初始 AJAX 调用,该文件可能如下所示:

$('#pic_upload').html('<%= escape_javascript(render :partial => 'base_64_response') %>');

这将呈现名为base_64_response.html.erb的 HTML 文件,该文件需要包含您希望出现在调用它的页面中的 html 代码。

<div id="pic_upload">
  <%= @base64 =>
</div>

循环是load page -> do something to trigger AJAX call to controller method -> process AJAX call with controller method -> render JS file -> JS file replaces div in page with new html

您可能需要阅读更多有关 AJAX 在 Rails 中如何工作的信息。 这个 RailsCast 可能有帮助http://railscasts.com/episodes/136-jquery-ajax-revised?view=asciicast

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

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

它可能会改变控制器为身体解析的内容。

如何通过 .ajax 以 base64 编码发布图像?

只需使用字符串而不是符号作为哈希键

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM