Rails, как вернуть Javascript через Ajax-вызов в: обновить действие контроллера - PullRequest
3 голосов
/ 21 апреля 2011

Я работаю над всплывающей модальной рамкой для отправки форм.Форма должна обновляться, если есть проблемы с проверкой, но все еще внутри модального поля.Это работает для добавления новой записи, которая, я полагаю, называется: создать действие, POST.Я хочу использовать тот же модальный блок для редактирования записи.Пока я могу открыть его в модальном окне, но как только появляются ошибки, он перенаправляется на другую страницу вместо того, чтобы оставаться внутри окна.Я думаю, что ajax не вызывает действие, чтобы вернуть javascript, чтобы вернуть форму обратно в модальное поле.Как мне получить ajax для возврата javascript обратно в модальное поле для исправления формы?

Пример, вот мое: create действие:

def create 
@user = User.new(params[:user])

respond_to do |format|
  if @user.save
    format.js { render :redirect } #this is for modalform     
    format.html { redirect_to(users_url, :notice => 'User was successfully created.') }
  else
    format.html {render :new}
    format.js # this renders the create.js.erb file to keep the form inside
  end
end
end  

Вот javascript, который загружает модальное поле и сохраняет форму внутри до тех пор, пока проверка не будет правильной:

document.observe('dom:loaded', function() {
$('newuser-link').observe('click', function(event) {
    event.stop();
    Modalbox.show(this.href,
        {title: 'Create',
        width: 500, #up to this point, this opens the form in the modal box
        afterLoad: function() { # this afterload part is supposed to keep the form inside the modal box
            $('new_user').observe('submit', function(event) {
                event.stop();
                this.request();
            })
        }}
    );
   });
 })  

А вот файл .js.erb, который вызывает действие: create, если есть ошибки проверки, чтобы сохранить форму внутри модального поля:

$('MB_content').update("<%= escape_javascript(render :partial => 'form') %>");
Modalbox.resizeToContent();
$('new_users').observe('submit', function(event) {
event.stop();
this.request();
});

То, что это работает для действия: create,как заставить это работать для действия: update, когда я хочу отредактировать запись?Опять же, основная проблема заключается в том, что при наличии ошибок проверки он перенаправляет за пределы модального поля.

ОБНОВЛЕНИЕ :
Я обнаружил, что в части javascript, которая должна держать модальное окно открытым:

$('new_user').observe('submit', function(event) {
                event.stop();
                this.request();  

, что 'new_user'это идентификатор формы.При использовании этого для редактирования записи, идентификатор формы - edit_user_1 или edit_user_32 или любой другой пользователь, который редактируется.Поэтому я думаю, что решение, которое я не могу найти, состоит в том, как использовать класс в javascript в качестве селектора вместо идентификатора.Потому что, когда я вручную добавляю 'edit_user_1' и редактирую пользователя с идентификатором 1, это работает ... но, очевидно, не для любого другого пользователя.

1 Ответ

1 голос
/ 22 апреля 2011

Вместо использования ModalBox я в конечном итоге использовал FaceBox (учебник здесь):

http://net.tutsplus.com/tutorials/ruby/how-to-build-an-unobtrusive-login-system-in-rails/

, который почти такой же, но, кажется, более гибкий с точки зрения добавления класса или идентификатора для селектора. Кроме того, когда дело доходит до динамических, рельсы генерируют идентификаторы, я использовал небольшой jQuery для создания переменной, которая получает динамическую ссылку и передает ее селектору:

var myid = jQuery('#userform').children().attr('id');

Затем, где он запрашивает идентификатор формы, которую я передаю в

'#' + myid  

В любом случае, я начал работать над этим, следуя приведенному выше руководству, и даже смог изменить его, добавив нового пользователя и отредактировав его.

...