Как я могу изменить действие, которое форма отправляет в отправку автосохранения jQuery? (в рельсах)

У меня есть модель комментария, для которой я хочу, чтобы люди могли сохранять черновики. Он имеет логический атрибут «черновик», который позволяет сохранить комментарий (но пока не отображать его). Я создаю функцию автосохранения для этих комментариев.

Текущая форма комментария работает следующим образом: переменная @comment инициализируется контроллером как @comment = Comment.new. Тогда форма для комментария:

  <%= form_for @comment, :remote => true do |f| %>
      <%= f.text_area :title, :class => "inputform" %>
      <%= f.text_area :content, :class =>"inputform" %>
      <%= f.submit "Submit", :class => "button" %>
  <% end %>

Итак, как я уже сказал, я хочу, чтобы это сохранялось автоматически. Чтобы начать это делать, я написал этот файл autosave_comments.js:

 $(document).ready(function(){
        setInterval(function() {
             $('new_comment .temp').html('<input type="hidden" name="comment[draft]" id="comment_draft" value="true" />');
             $('#comment_form form[data-remote]').submit();
             $('new_comment .temp').html('');
        }, 10000);
  });

Этот код устанавливает ввод для черновика в значение true, отправляет форму, а затем удаляет этот ввод для черновика. Этот код отлично работает, поскольку он отправляет форму и сохраняет черновик в контроллере. ОДНАКО при каждом представлении сохраняется новая запись (т.е. каждые 10 секунд новый комментарий сохраняется в базе данных как черновик), а не обновляется первая запись.

И последнее немного предыстории: когда форма отправляется контроллеру комментариев, она подчиняется действию создания:

 def create
     @comment = params[:comment]
     if @post.save
         if params[:draft]
              flash.now[:notice] = "draft autosaved"
         else
              flash.now[:success] = "comment created"
         end
     else
         #code to output errors
     end
     respond_to do |format|
           format.html 
           format.js
     end
  end

Затем это ссылается на файл create.js.erb:

    <% post = user.posts.last %>
    <% if post.draft == false %>
        //code here deals with a true submission of a comment, to append tables etc.
    <% else %>
        //maybe some code here could alter the form on draft submission to make it update the same post next time?
    <% end %>

Итак, мне интересно, я хотел бы, чтобы первый черновой вариант работал так же, как и создать запись в таблице комментариев. НО затем я хочу, чтобы форма обновляла этот комментарий при последующих автосохранениях и сохраняла комментарий как окончательный комментарий без черновика, когда человек отправляет комментарий для публикации. Есть ли в одном из этих файлов место, где я могу это сделать?

Спасибо!


person geb2011    schedule 11.10.2011    source источник


Ответы (1)


In create.js.erb:

$('#comment_form').attr('action', '<%= comment_path(@comment) %>');

Просто убедитесь, что ваша форма комментариев имеет идентификатор comment_form, или соответствующим образом измените объект jQuery. Об остальном должны позаботиться рельсы.

изменить Я забыл, что вам также нужно подделать запрос PUT, как это делает Rails. Поскольку некоторые браузеры не поддерживают запросы PUT, rails использует POST, а затем добавляет скрытое поле формы:

<input name="_method" type="hidden" value="put" />

Так что просто создайте это в своем create.js.erb:

$('#comment_form').append('<input name="_method" type="hidden" value="put" />');
person bricker    schedule 11.10.2011
comment
Это почти работает, но затем при отправке POST на локальный хост выдается ошибка отсутствия маршрута: ActionController::RoutingError (Нет совпадений маршрута /posts/139). Я понятия не имею, почему он это делает, для меня это должно работать с кодом, который вы написали. Есть идеи? - person geb2011; 11.10.2011