我正在尝试在rails中创建一个启用ajax的表单。当我单击提交按钮时,表单正在正确保存(我可以看到更新发生在数据库中),但是,页面就在那里(看起来好像什么也没发生,没有重定向,等)在我的网络检查员中,我看到以下错误:
POST http://localhost:3000/user/mike 500 (Internal Server Error)
但是,当我点击上面的链接(http:// localhost ...)时,会显示包含:notice
的页面。
我希望页面像往常一样重定向,并显示:notice
(如果可用)。我还希望能够将表单保存在ajax上,而不会在某个时间间隔(每分钟左右)重定向。这可能吗?
user_controller.rb
def create
@user = User.new(params[:user])
respond_to do |format|
if @user.save
format.html { redirect_to(@user, :notice => 'User saved.') }
format.js
else
format.html { render :action => "new" }
format.js
end
end
end
def update
@user = User.find_by_username(params[:id])
respond_to do |format|
if @user.update_attributes(params[:user])
format.html { redirect_to(@user, :notice => 'User updated.') }
format.js
else
format.html { render :action => "edit" }
format.js
end
end
end
而且,这是我的表格标签:
<%= form_for @user, :remote => true, :html => { :multipart => true, :class => 'edit_profile' } do |f| %>
任何建议都会非常有用......谢谢大家。
答案 0 :(得分:1)
如果你想让create action成为ajax,你需要添加一个create.js模板(create.js.erb或create.js.haml),它将提供一些脚本来在页面上呈现消息
(假设jquery和ERB) - create.js.erb:
<% if @user.errors.any? %>
//update a div here with the errors collection
<% else %>
$("#flash_notice").html("<%= escape_javascript(flash[:notice])%>");
<% end %>
如果发生错误以向用户显示错误列表,则需要一些额外的逻辑。最简单的是,如果表单已经是部分的,因为您可以重新呈现显示错误集合的部分。或者,您可以将错误集合写出为div。
至于在后台定期更新,发布表单的简单javascript计时器可以正常工作。在控制器中,您可以不渲染任何内容(使用render nothing:true),或者提供update.js脚本来更改消息,例如“上次保存在xxxx”。