1

AJAXに関しては全くの初心者で、少し助けが必要です。私は posts_controller と likes_controller を持っています:

ユーザーは投稿に「いいね」または「いいね」を付けることができます。現在、私は AJAX を実装して、ユーザーが投稿を「いいね」するか投稿を「いいね」しないたびにいいね/いいねが切り替わるようにしようとしています。

AJAX の前は、ページが更新され、ビュー内のコードが特定の投稿が現在のユーザーに気に入られたかどうかを判断していました。ビューで if ステートメントを実行したところ、結果に応じて 2 つの異なるフォームが表示されました。投稿がまだいいねされていない場合は、投稿を「いいね」するためのフォーム (作成アクション) と、投稿が既にいいねされている場合です。いいね、投稿を「アンいいね」するフォーム(アクションを破棄)がありました。

AJAX を使用して create パーツを実装したので、like は動的に発生しますが、ビューは変わりません (like はターミナル/レール コンソール経由で作成されていることがわかりますが、リンクのテキストは同じままです)。ページを更新せずにビューを更新する最善の方法を教えてください。AJAX経由でいいねが発生したら、「いいね」リンクとフォームを「いいね」リンクとフォームで更新する必要があります。jquery経由でこれを行う唯一の方法はありますか?

これが私のコードです:likes_controller

class LikesController < ApplicationController

  def create
    @post = Project.find(params[:like][:likee_id])

    respond_to do |format|
      format.html{
        current_profile.like!(@post)
        redirect_to :back
      }
      format.js {
        current_profile.like!(@post)
      }
    end  

  end
  def destroy
    @post = Like.find(params[:id]).likee
    current_profile.unlike!(@post)
    redirect_to :back
  end
end

ビューのスニペット:

%ul.dropdown-menu
  %li
    - if current_profile.like?(post)
      = form_for current_profile.likes.find_by_likee_id(post), :html => { :method => :delete } do |f|
        %a{:href => "javascript:void(0)", :onclick=>"$(this).closest('form').submit()"}
          %i.icon-heart.icon-large{:style => "color: #fedc73;"}
          Unlike this Post
      - else
        = form_for current_profile.likes.build(:likee_id => post.id), :remote => true do |f|
          = f.hidden_field :likee_id
          %a{:href => "javascript:void(0)", :onclick=>"$(this).closest('form').submit()"}
            %i.icon-heart-empty.icon-large
            Like this Post

create.js.haml ファイル:

:plain
  $(this).closest('form').submit()

どんな助けでも大歓迎です。どうもありがとう!

4

1 に答える 1

0

あなたが使用することができます

$.post('url', data, function(returned_data){ $.('like_div').html(returned_data) })

ただし、手動でリンクを作成する代わりに、レールを使用してリンクを生成できます。

= link_to url_for(...), :remote => true

これは、js が無効になっている場合でも機能し、このためのフォームは必要ありません。

- if current_profile.like?(post)
  = link_to url_for(:controller => :posts, :action => :unlike, :id => post.id), :remote => true
- else
  = link_to url_for(:controller => :posts, :action => :like, :id => post.id), :remote => true

もちろん、このアクションは .js と .html に応答する必要があります。後者では、ビュー全体をレンダリングできます。.js では、リンク div をこの更新されたものに変更する js のスニペットを挿入できます。これ以上説明が必要ですか?

于 2012-04-29T18:10:37.663 に答える