我刚刚更新到Rails 3.1并且创建模型对象的典型ajax表单在成功时产生以下错误:ActionView :: Template :: Error(未定义的方法gsub’用于#< ActionDispatch :: Flash :: FlashHash:0x00000102b73b78> ):
创建操作进展顺利,数据被提交到数据库,但页面不会更改,并且js不会执行.如果出现错误,js DOES可以正常工作,产生错误消息……所以只有成功产生错误并且无法执行js.
这是我的代码:
控制器:
def create @contact = Contact.new(params[:contact]) respond_to do |format| if @contact.save flash[:notice] = "Welcome!" format.html format.js else format.html { render 'pages/home'} format.js end end end
查看表单
<div id="contact_notice"></div> <%= form_for @contact,:remote => true do |f| %> <%= f.text_field :email,:id => 'email','data-default' => 'Sign up to join the beta!' %><%= f.submit "Submit",:id => 'submit' %> <% end %>
/views/contacts/create.js.erb
<% if @contact.errors.any? %> // Create errors var errors = $('<div class="flash notice"></div>'); <% @contact.errors.full_messages.each do |error| %> errors.append('<%= escape_javascript( error ) %>'); <% end %> // Display errors $("#contact_notice").html(errors); <% else %> // Display success (clearing any errors) $("#contact_notice").html('<div class="flash notice"><%=escape_javascript(flash.delete(:notice)) %></div>'); <% end %>
这是保存新联系人时的堆栈跟踪:
Rendered contacts/create.js.erb (0.6ms) Completed 500 Internal Server Error in 13ms ActionView::Template::Error (undefined method `gsub' for #<ActionDispatch::Flash::FlashHash:0x000001042b1970>): 12: <% else %> 13: 14: // Display success (clearing any errors) 15: $("#contact_notice").html('<div class="flash notice"><%= escape_javascript(flash.delete(:notice)) %></div>'); 16: 17: <% end %> app/views/contacts/create.js.erb:15:in `_app_views_contacts_create_js_erb__3535867194219445180_2168748520' app/controllers/contacts_controller.rb:6:in `create'
如果你能看到我在这里缺少的东西,请告诉我.谢天谢地.
解决方法
Rails改变了3.1中的一些工作方式,从我的理解Rails 3.1不再使用
Hash for
FlashHash它们现在基于
Enumerable
Here is an answer更详细.你应该可以使用:
flash.discard(:notice)
而不是旧的:
flash.delete(:notice)