У меня есть представление Rails (recipes / new), которое позволяет пользователям вводить новый рецепт.В этом представлении пользователь может выбирать элементы другой модели, ингредиенты.Я хотел, чтобы пользователи добавляли новый ингредиент, не покидая форму рецепта.
Я создал ссылку на новые ингредиенты, которая загружает модальное окно JQuery.Вот код в моем recipes.js
файле, который управляет модалом:
assets / javascripts / recipes.js
этот код из ответа @ coreyward -смотрите Jquery модальные окна и редактируйте объект для деталей - спасибо, Кори!
$(function(){
var $modal = $('#modal'),
$modal_close = $modal.find('.close'),
$modal_container = $('#modal-container');
$('a[data-remote]').live('ajax:beforeSend', function(e, xhr, settings){
xhr.setRequestHeader('accept', '*/*;q=0.5, text/html, ' + settings.accepts.html);
});
$('a[data-remote]').live('ajax:success', function(xhr, data, status){
$modal
.html(data)
.prepend($modal_close)
.css('top', $(window).scrollTop() + 40)
.show();
$modal_container.show();
});
$('.close', '#modal').live('click', function(){
$modal_container.hide();
$modal.hide();
return false;
});
});
Моя ссылка в recipes / new.html.erb:
<%= link_to 'New ingredient', new_ingredient_path, :remote => true %>
Это прекрасно работает, в том смысле, что оно загружает модальную форму с новой формой ингредиента.Я могу заполнить форму, и, если ингредиент сохранен, я вызываю другую функцию из моего контроллера, чтобы закрыть модальный режим:
ингридиенты_контроллера.rb
def create
if @ingredient.save
respond_to do |format|
format.js { render :js => "close_modal();" }
end
end
end
Моя проблема в том, что форма не заполнена правильно.Пользователь щелкает и не получает никаких отзывов о наличии каких-либо ошибок / пропущенных полей и т. Д. Я хотел бы перезагрузить форму ингредиента во всплывающем окне, в результате чего общие ошибки будут частично отображены:
ингридиенты / new.html.erb
<%= form_for @ingredient, :remote => true do |i| %>
<%= render 'shared/ingredient_error_messages' %>
<div class="field">
<%= i.label :name %>
<%= i.text_field :name %>
</div>
<div class="field">
<%= i.label :srm %>
<%= i.text_field :srm %>
</div>
<div class="field">
<%= i.label :price %>
<%= i.text_field :price %>
</div>
<div class="actions">
<%= i.submit "Save ingredient" %>
</div>
<% end %>
shared / _ingredient_error_messages.html.erb
<% if @ingredient.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@ingredient.errors.count, "error") %>
prohibited this recipe from being saved:</h2>
<p>There were problems with the following fields:</p>
<ul>
<% @ingredient.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
Какой лучший способ заставить это работать?Я могу легко создать другую функцию JS и вызвать ее из контроллера, если сохранение не удастся, но я не могу найти способ передать что-либо, кроме прямого текста / HTML.Есть ли способ, в контроллере, я могу проанализировать и вывести в функцию содержимое моего «нового» представления?Есть ли лучший / более чистый способ сделать это?