rails ajax表单保存,重定向,更新问题

时间:2011-11-29 18:47:17

标签: jquery ruby-on-rails ruby ajax ruby-on-rails-3

我正在尝试在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| %>

任何建议都会非常有用......谢谢大家。

1 个答案:

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