Кнопка "Мне нравится" для пользователей с ежедневными постами, не обновляющимися с помощью AJAX
Я передаю коллекцию (@feed_items) частичке _feed_item через параметр:collection и преобразую ее в dailypost с помощью:as =>:dailypost.
Внутри части _feed_item я рендерил другую часть для _like_button, и я использовал:localals для продолжения использования dailypost.
Все отлично работает с базой данных. Любит добавляются и выносятся:) НО
Я пытаюсь использовать (AJAX) через toggle.js.erb, чтобы нравится или не нравится. По некоторым причинам, он не обновляется правильно, и мне приходится обновлять страницу каждый раз. Какие-либо предложения???
МОДЕЛИ
class Like < ActiveRecord::Base
attr_accessible :dailypost_id, :user_id
belongs_to :user
belongs_to :dailypost
default_scope order: 'likes.created_at DESC'
end
Контроллеры
likes_controller.rb
class LikesController < ApplicationController
respond_to :html, :js
def create
@like = Like.create(params[:like])
@dailypost = @like.dailypost
render :toggle
end
def destroy
like = Like.find(params[:id]).destroy
@dailypost = like.dailypost
puts "----------------like destroyed"
render :toggle
end
end
Просмотры
_feed.html.erb
<% if @feed_items.any? %>
<ol class="dailyposts postusers">
<%= render partial: 'shared/feed_item', collection: @feed_items, :as => :dailypost %>
</ol>
<%= will_paginate @feed_items %>
<% end %>
_feed_items.html.erb
<li id="<%= dailypost.id %>">
<span class="user">
<%= link_to dailypost.user.name, dailypost.user %>
<%= link_to dailypost.id %>
<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 %>
toggle.js.erb
$("#like").html("<%= escape_javascript(render :partial => 'like_button', :locals => {:dailypost => @dailypost}) %>");
БАЗА ДАННЫХ
ActiveRecord::Schema.define(:version => 20130210095553) do
create_table "dailyposts", :force => true do |t|
t.string "content"
t.string "content_html"
t.integer "user_id"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
add_index "dailyposts", ["user_id", "created_at"], :name => "index_dailyposts_on_user_id_and_created_at"
create_table "likes", :force => true do |t|
t.integer "dailypost_id"
t.integer "user_id"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
create_table "users", :force => true do |t|
t.string "name"
t.string "email"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
t.string "password_digest"
t.string "remember_token"
t.boolean "admin", :default => false
end
add_index "users", ["email"], :name => "index_users_on_email", :unique => true
add_index "users", ["remember_token"], :name => "index_users_on_remember_token"
end
1 ответ
Решение
Похоже, что ваша форма неправильно устанавливает dailypost_id, попробуйте изменить форму с:
<%= form_for(current_user.likes.build(dailypost_id: @dailypost.id), remote: true) do |f| %>
<%= f.hidden_field :dailypost_id %>
чтобы:
<%= form_for(current_user.likes.build, remote: true) do |f| %>
<%= f.hidden_field :dailypost_id, value: @dailypost.id %>