[英]Using AJAX POST from javascript to Rails 4 controller with Strong parameter
[英]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%>"
});
它可能会改变控制器为身体解析的内容。
只需使用字符串而不是符号作为哈希键
if params["base64"].present?
@base64 = params["base64"]
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.