AJAX-форма Rails 3.1 - "ActionView :: Template :: Error" (неопределенный метод `gsub 'для #):» - PullRequest
6 голосов
/ 03 сентября 2011

Я только что обновил до Rails 3.1, и типичная форма ajax для создания модельного объекта выдает следующую ошибку при успехе: ActionView::Template::Error (undefined method gsub' for #<ActionDispatch::Flash::FlashHash:0x00000102b73b78>):

Действие создания идет хорошо, данные передаются в базу данных, но страница не меняется и js не выполняется.js работает, если есть ошибка, выдавая сообщение об ошибке, как и ожидалось .... Таким образом, только успех вызывает ошибку и не может выполнить 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'

Дайте мне знать, если вы видите, что мне здесь не хватает.Спасибо большое.

1 Ответ

9 голосов
/ 03 сентября 2011

Rails изменил способ работы некоторых вещей в 3.1, насколько я понимаю, Rails 3.1 больше не использует Hash для FlashHash , и теперь они основаны на перечислимых . Вот ответ , который более подробно описан.Вы должны быть в состоянии использовать:

flash.discard(:notice)

Вместо старого:

flash.delete(:notice) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...