2011-11-29 57 views
0

我试图在rails中创建一个启用ajax的窗体。当我点击提交按钮时,窗体正常保存(我可以看到更新发生在数据库中),但是,页面刚好位于那里(看起来好像什么都没有发生,没有重定向等),并且在我的Web检查,我看到以下错误:Rails的AJAX形式保存,重定向,更新问题

POST http://localhost:3000/user/mike 500 (Internal Server Error) 

然而,当我点击上面的链接(HTTP://本地主机...)显示在页面包括: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

我没有时间收集链接,但应该定期查看ajax轮询以保存表单。如果您希望页面在提交时重定向,则应从表单中删除remote => true。默认情况下,Rails会查找一个update.js视图文件,以便在通过ajax发送表单时作出响应。如果你没有它,它在客户端不会做任何事情。 – Msencenb

回答

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”。