【问题标题】:Issue passing parameter to Rails controller using AJAX使用 AJAX 将参数传递给 Rails 控制器
【发布时间】:2020-05-09 01:21:51
【问题描述】:

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

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

感谢任何建议,谢谢!

查看

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,我想我们需要知道这里的时间线流程。您加载视图,然后通过 AJAX 发送值?然后,您是否使用新数据刷新部分视图?仅仅因为您通过 AJAX 将其发送到控制器并不意味着它会更新当前页面上的任何内容。
  • 所以我试图将一个 JavaScript 变量上传到我的 rails 服务器。在我的视图 (html) 中,我在画布中有一张图像,我将其转换为 base64。我想以某种方式将其存储在 Ruby 变量中,以便可以将其作为图像上传到我的服务器。我在网上搜索,普遍的共识是使用 AJAX,但它不适合我。我只是在 Web 浏览器的调试控制台中回显它。
  • @Beartech 我加载视图然后通过 AJAX 发送它。我没有刷新视图。
  • 您正在通过 AJAX 发布到您已经在查看的视图。如果你想使用 AJAX,你需要遵循一定的流程。你需要在你的控制器中创建一个接受信息的方法,然后用那个信息做一些事情。然后它应该发回一个 AJAX 响应,更新发送它的页面的某些部分,以便您知道它有效。

标签: javascript jquery ruby-on-rails ajax model-view-controller


【解决方案1】:

如果我理解正确,您正在尝试将 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 

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

$('#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

【讨论】:

    【解决方案2】:

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

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

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

    How to post an image in base64 encoding via .ajax?

    【讨论】:

      【解决方案3】:

      只需使用 string 而不是 symbol 作为哈希键

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-04
        • 2015-08-11
        • 1970-01-01
        • 2018-07-14
        相关资源
        最近更新 更多