Модальная форма Rails - обновление всплывающего окна содержимым из файла html.erb после неудачной отправки формы - PullRequest
3 голосов
/ 29 февраля 2012

У меня есть представление 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.Есть ли способ, в контроллере, я могу проанализировать и вывести в функцию содержимое моего «нового» представления?Есть ли лучший / более чистый способ сделать это?

1 Ответ

3 голосов
/ 29 февраля 2012

Вот ссылка на github Rails JQuery-Modal форму, которая была разработана Ramblex для этой цели:

https://github.com/ramblex/modal-form

Вот соответствующий SO вопрос, который он решил (чтобы вы могли выразить ему ответ): Rails и диалоговая форма модального jquery

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