如何将 JavaScript 变量传递给 Rails 控制器

How to pass a JavaScript var into a Rails Controller

我正在寻找 将 JavaScript 变量传递给 Rails 控制器 。有趣的是变量是在 Canman 内部生成的,我不能在它之外使用它(还)。

这可能只是JavaScript,与Canman没有必然联系。但我只是不确定这里发生了什么。

我正在遵循的方法(但如果有更好的方法则完全开放)是用 jQuery 填充隐藏字段,只是为了通过控制器的参数访问数据。

如果可能(如果这是一个好的做法),我想避免这种形式,只需在单击时调用一些 JavaScript,然后将该变量传递给控制器​​。


查看

= form_for @post do |form|
  = form.hidden_field :base64
  = form.submit


JavaScript

$('form').submit(function(event){

  Caman('#canvas', img, function() {
    var imageBase64 = this.toBase64();
    alert(imageBase64); // works fine
    $('#post_base64').val(imageBase64);
  });

  alert(imageBase64); // nothing
});


帖子控制器

def update
  @post = Post.find(params[:id])
  raise '¯\_(ツ)_/¯'
  ...
end


post_params

=> {"base64"=>""}

另外,我读到一个选项是提出 AJAX 请求。但是,我还不确定如何进行。

在某些时候,我尝试使用 text_area 而不是 hidden_field。 text_area 填充了正确的数据。但是,params 从未获得数据。如果我通过浏览器按钮返回,数据在 text_area 中,然后再次单击提交,按预期填充参数。

提前致谢!

简答:Ajax.

目标是将变量的值(一个 base64 图像)发送到我的 rails 控制器,一旦到达那里,就继续 Ruby。

最后,我创建了一个简单的 Ajax 函数,通过 params[=14 将数据从我的客户端(来自浏览器的图像)发送到我的服务器(Rails 控制器) =]

save_canvas.js

$(document).on('click', '.save_canvas', function() {
  event.preventDefault()
  var base64Data = canvas.toDataURL('png')

  $.ajax({
    type:    "POST",
    url:     "http://localhost:3000/pictures/",
    data:    { image: base64Data },
    success: function(post){ console.log('success') },
    error:   function(post){ console.log(this) }
  })
})

pictures_controller.rb

  def create
    @picture = Picture.new(image: params[:image])
    @picture.save
    redirect_to @picture
  end

我得到了实现此目标的支持