내 앱에서 좋아요/안 좋아요 기능을 구현했습니다. 항목의 표시 페이지에서 아무 문제없이 좋아할 수 있습니다. 사용자 프로필 페이지에는 업로드 한 모든 음식이 나열되어 있는데, 두 가지 문제가 있습니다. 첫째, 한 음식에 대해 같은 버튼을 클릭하면 모든 음식에 대해 실행되고 모든 음식 아래에 버튼 텍스트가 표시됩니다. "이 음식과는 다른"대신 클릭 한 음식에 대한 버튼 텍스트 만 변경하는 것입니다. 같은 음식에 대해 DB에 저장된 내용이 저장되지만 분명히 내가 좋아하지 않은 음식에 대해 단추 텍스트가 변경되는 것을 원하지 않습니다. 둘째, 내가 상쾌하게하지 않고 페이지에서 다른 음식을 좋아하면, 실제로 클릭 한 음식 대신에 내가 클릭 한 음식으로 DB에 저장됩니다.좋아하는 버튼이 모든 게시물을 좋아합니다.
users.show.html.erb
<% @user.foods.each do |food| %>
<div class="row col-md-12">
<div class="food col-md-4">
<h3 class="title"><%= link_to food.title.capitalize, food_path(food.id) %></h3>
<%= link_to (image_tag (food.image.url)), food_path(food.id) %>
<%= render 'shared/vote_form', :food => food %>
<%= link_to pluralize(food.votes.count, "person"), user_votes_path(:user_id => current_user.id, :food_id => food.id) %> <%= food.votes.count == 1 ? 'wants' : 'want' %> to gobble this
</div>
<div class="description col-md-6">
<% if @user.id == current_user.id %>
<% if food.description.length == 0 %>
<p><%= link_to "Add Description", edit_food_path(food) %></p>
<% else %>
<p><%= food.description %><p>
<p><%= link_to "Edit Description", edit_food_path(food) %></p>
<% end %>
<% if food.recipe.length == 0 %>
<p><%= link_to "Add Recipe", edit_food_path(food) %></p>
<% end %>
<% else %>
<% if food.description.length == 0 %>
<p>No Description</p>
<% else %>
<p><%= food.description %><p>
<% end %>
<% if food.recipe.length == 0 %>
<p>No Recipe</p>
<% else %>
<p><%= link_to "View Recipe", food_path(food) %></p>
<% end %>
<% end %>
</div>
</div>
<% end %>
표 제어기
class VotesController < ApplicationController
def index
@votes = Food.find(params[:food_id]).votes
end
def new
@vote = current_user.votes.new
end
def create
@user = current_user
@vote = current_user.votes.build(vote_params)
if @vote.save!
@food = @vote.food
respond_to do |format|
format.html {redirect_to :back, notice: "Liked!"}
format.js
end
puts @vote.food.id
else
puts "No"
redirect_back(fallback_location: root_path)
end
end
def show
@user = current_user
@vote = Vote.find(params[:id])
end
def destroy
@vote = Vote.find(params[:id])
@food = @vote.food
if @vote.destroy!
respond_to do |format|
format.html {redirect_to :back, notice: "Unliked!"}
format.js
end
else
puts "NOOOOOO"
end
end
private
def vote_params
params.require(:vote).permit(:food_id)
end
end
vote partial
<% unless current_user.votes.pluck(:food_id).include?(food.id) %>
<%= button_to "Like This Food", user_votes_path(current_user, { vote: { food_id: food.id } }), :remote => true %>
<% else %>
<% vote = food.votes.where(user_id: current_user.id).first %>
<%= button_to "Unlike This Food", user_vote_path(current_user, vote), :remote => true, method: "delete" %>
<% end %>
create.js.erb
$('.button_to').replaceWith("<%= j (render :partial => 'shared/vote_form', :locals => { :food => @food, :food_id => @food.id }) %>");
흠 말이야. ID를 추가하는 대신 지금 가지고있는 항목에 .click 함수를 추가 한 다음 $ (this)를 사용할 수 있습니까? –
또한 사용자가 많은 양의 식품을 업로드 한 경우 .js.erb 파일에 $ ("# like-1")와 같은 버튼 ID를 동적으로 생성하는 방법을 모르겠습니다. –
'id : # {@ food.id} "를 'button_to'에 대한 인수로 사용합니다. 이렇게하면 생성 된 요소에 ID가 추가됩니다. 'js.erb' 파일에서'$ (. button_to ')'대신'$ ('# food - <% = @ food.id %> ')'를 사용하십시오. 'this'와 관련하여'data-like'와'data-unlike' 속성을 지정하여 음식 ID로 설정할 수 있습니다. 그런 다음 이러한 속성이있는 버튼 클릭과 일치하는 이벤트 핸들러를 컨테이너에 추가하고 요청을 실행하고 응답을 기반으로 페이지를 업데이트 할 수 있습니다. 그래도 더 복잡해질거야. –