jquery - Rails 3.1 AJAX 表单 - "ActionView::Template::Error (undefined method ` gsub' for #<ActionDispatch::Flash::FlashHash:0x00000102b73b78>):"

标签 jquery ruby-on-rails ajax ruby-on-rails-3.1

我刚刚更新到 Rails 3.1,创建模型对象的典型 ajax 表单在成功时会产生以下错误:ActionView::Template::Error (undefined method gsub' for #<ActionDispatch::Flash::FlashHash:0x00000102b73b78>):

create Action 进行得很顺利,数据提交到数据库,但是页面没有变化,js没有执行。如果出现错误,js 确实会工作,并按预期生成错误消息......所以只有成功才会生成错误并且无法执行 js。

这是我的代码:

Controller :

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对于 FlashHash不再有,他们现在基于EnumerableHere is an answer更详细的内容。您应该能够使用:

flash.discard(:notice)

代替旧的:

flash.delete(:notice) 

关于jquery - Rails 3.1 AJAX 表单 - "ActionView::Template::Error (undefined method ` gsub' for #<ActionDispatch::Flash::FlashHash:0x00000102b73b78>):",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7289277/

相关文章:

jquery - 无法使用变量使用 jQuery 设置 'background-image'

javascript - HAML 中 Javascript 中的 Ruby 方法

ruby-on-rails - Rails - 检查 has_many 关联中是否存在记录

JavaScript 未在 Rails 回调中执行?

ruby-on-rails - 生产模式下的 SSL 连接错误 Rails 3.2.3 瘦服务器

javascript - 为什么这在 IE 中失败?

php - 使用数据库中的 ajax 下拉列表更改文本不起作用 Codeigniter

javascript - 为目标为 ="_blank"的 URL 显示带有固定消息的弹出窗口

java - 使用 jquery 调用 java 服务器端方法

javascript - 何时使用 iframe、ajax() 或 load()?