1

下書きを保存できるようにするコメントモデルがあります。コメントを保存できるブール属性「draft」があります(ただし、まだ表示されていません)。これらのコメントの自動保存関数を作成しています。

現在のコメントフォームは次のように実行されます。変数@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 %>

ですから、最初のドラフト提出がそれと同じように機能し、コメントテーブルにエントリを作成したいと思います。しかし、その後、フォームが後続の自動保存でそのコメントを更新し、その人が投稿のためにコメントを送信したときに、コメントをドラフトではない最終コメントとして保存する必要があります。これらのファイルの1つに、これを達成できる概要がある場所がありますか?

ありがとう!

4

1 に答える 1

3

create.js.erb

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

コメントフォームのIDがcomment_form、であることを確認するか、それに応じてjQueryオブジェクトを変更してください。残りはレールが処理する必要があります。

編集RailsのようにPUTリクエストも偽造する必要があることを忘れました。一部のブラウザはPUTリクエストをサポートしていないため、railsはPOSTを使用してから、非表示のフォームフィールドを追加します。

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

だからあなたの中でそれを生成するだけですcreate.js.erb

$('#comment_form').append('<input name="_method" type="hidden" value="put" />');
于 2011-10-11T15:28:37.817 に答える