my routes.rb:
post 'home/review'
my home_conrtoller.rb:
def review
@review = Review.new(review_params)
@review.image = params[:review][:image]
if @review.save
respond_to do |format|
format.js { render 'review', locals: {review_name: @review.review_name, review_body: @review.review_body} }
end
else
format.html { respond_to root_path}
end
end
private
def review_params
params.require(:review).permit(:review_name, :review_body, :image)
end
my review.js:
$(function() {
var theHTML = [];
theHTML.push('somewhat');
$(".wrap-body").append(theHTML.join(''));
});
我的index.html.erb
<%= form_tag home_review_path, :method => 'post', :multipart => true, :remote => true do %>
<%= text_area_tag 'review[review_body]'%>
<%= text_field_tag 'review[review_name]'%>
<%= file_field_tag 'review[image]' %> <==== problem !!!
<%= submit_tag 'Send'%>
<%end %>
问题:如果我添加
index.html.erb中的<% = file_field_tag 'review [image]'%>
,rails会抛出错误:
HomeController#review 中的ActionController :: UnknownFormat
但是如果index.html.erb中的字段<% = file_field_tag 'review [image]'%>
没有返回review.js !!!
如何更改home_controller.rb中始终为rails返回review.js的index.html.erb或action,从不重新加载页面?
对不起我的英语((
答案 0 :(得分:1)
也许不是直接的解决方案,但我建议使用Remotipart gem,它仅用于使用remote: true
表单在rails中上传ajax文件,因为在remote
中使用文件上传时form,rails回退到HTML提交。
PS:我不确定我是否完全解决了你的问题,这可能不是确切问题的解决方案。
答案 1 :(得分:0)
您无法使用远程true选项提交文件,您可以尝试使用
$("#send").click(function () {
var fd;
fd = new FormData(document.getElementById("reviewForm"));
$.ajax({
url: "/home/review",
type: "POST",
data: fd,
processData: false,
contentType: false
});
});
答案 2 :(得分:0)
我解决了以下问题:
my home_conrtoller.rb:
def review
@review = Review.new(review_params)
if @review.save
render json: {review_name: @review.review_name, review_body: @review.review_body, review_image: @review.image.url}
else
respond_to root_path
end
private
def review_params
params.require(:review).permit(:review_name, :review_body, :image)
end
end
my review.js
$(function() {
"use strict"; // Start of use strict
$('#form_review').ajaxForm({
success: SubmitSuccesful
});
});
function SubmitSuccesful(responseText) {
var theHTML = [];
theHTML.push('<img src="'+ responseText.review_image+'">');
$(".wrap-body").append(theHTML.join(''));
}
和我的index.html.erb,删除&#34;:remote =&gt;真&#34;
<%= form_tag home_review_path, :method => 'post', :multipart => true do %>
<%= text_area_tag 'review[review_body]'%>
<%= text_field_tag 'review[review_name]'%>
<%= file_field_tag 'review[image]' %>
<%= submit_tag 'Send'%>
<%end %>
结果:form(file和text_fields)向控制器发送(&#39; post&#39;方法)。控制器以JSON格式回答。回调函数收到事件&#34;成功&#34;并在没有重新加载页面的情况下更新html。