tud*_*ddy 6 ajax jquery ruby-on-rails ruby-on-rails-3.1
我刚刚更新到Rails 3.1并且创建模型对象的典型ajax表单在成功时产生以下错误: ActionView::Template::Error (undefined method gsub' for #<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
Run Code Online (Sandbox Code Playgroud)
查看表单
<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 %>
Run Code Online (Sandbox Code Playgroud)
/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 %>
Run Code Online (Sandbox Code Playgroud)
这是保存新联系人时的堆栈跟踪:
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'
Run Code Online (Sandbox Code Playgroud)
如果你能看到我在这里缺少的东西,请告诉我.谢天谢地.
Rails改变了3.1中的一些工作方式,根据我的理解,Rails 3.1不再使用Hash作为FlashHash,现在它们基于Enumerable.这是一个更详细的答案.你应该可以使用:
flash.discard(:notice)
Run Code Online (Sandbox Code Playgroud)
而不是旧的:
flash.delete(:notice)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4131 次 |
| 最近记录: |