0

コレクション (@feed_items) を :collection オプションを介して _feed_item パーシャルに渡し、:as => :dailypost でそれを Dailypost に変換しています。

_feed_item パーシャル内で、_like_button の別のパーシャルをレンダリングし、:locals を使用して、dailypost を引き続き使用しました。

すべてがデータベースで正常に動作します。いいねが追加されて削除されます:)しかし

(AJAX) を使用して create.js.erb と destroy.js.erb のようなボタンを作成しようとしています。何らかの理由で、一番上の投稿のみが正しく更新され、その下の投稿を表示するにはページを更新する必要があります。

ソリューションには、「like-123」などの各「いいね」要素に一意の投稿IDを割り当てることが含まれることを知っていますが、それが私が行き詰まっているところです........

また、2 つの ID を渡しているため、_feed_items.html.erb に問題がある可能性があることもわかっています。

ビュー

_feed.html.erb

<% if @feed_items.any? %>
  <ol>
    <%= render partial: 'shared/feed_item', collection: @feed_items, :as => :dailypost %>
  </ol>
<% end %>

_feed_items.html.erb

<li id="<%= @dailypost.id %>">

  <span class="user">
    <%= link_to dailypost.user.name, dailypost.user %>
  <span class="content"><%= dailypost.content_html %></span>

  <div id="like">
    <%= render :partial => 'likes/like_button', :locals =>{:dailypost => dailypost} %>
  </div>

</li>

_like_button.html.erb

<% if like = current_user.likes.find_by_dailypost_id(dailypost.id) %>
 <%= form_for like, :html => { :method => :delete }, :remote => true do |f| %>
   <%= f.submit "Unlike" %>
 <% end %>
<% else %>
 <%= form_for current_user.likes.build, :remote => true do |f| %>
  <div><%= f.hidden_field :dailypost_id, value: dailypost.id %></div>
  <%= f.hidden_field :user_id %>
  <%= f.submit "Like" %>
 <% end %>
<% end %>

create.js.erb

$("#like").html("<%= escape_javascript(render :partial => 'like_button', :locals => {:dailypost => @dailypost}) %>");

destroy.js.erb

$("#like").html("<%= escape_javascript(render :partial => 'like_button', :locals => {:dailypost => @dailypost}) %>");

コントローラ

class LikesController < ApplicationController


  respond_to :html, :js

  def create
    @like = Like.create(params[:like])
    @dailypost = @like.dailypost
    respond_to do |format|
      format.js
      format.html { redirect_to :back }
    end
  end

  def destroy
    like = Like.find(params[:id]).destroy
    @dailypost = like.dailypost
    respond_to do |format|
      format.js
      format.html { redirect_to :back }
    end
  end

end
4

1 に答える 1

1

うーん、_feed_items.html.erb の最初の行をこれに置き換えます。

<li id="dailypost<%= dailypost.id %>">

そして create.js.erb と destroy.js.erb で、変更を加えます

$("#like").html(...)

$("#dailypost<%= dailypost.id%> #like").html(...)

これはうまくいくはずです。

于 2013-03-22T07:32:23.250 に答える