Hey I am trying to render a partial using ajax everything work in rails normal form but when I am rendering a partial using ajax local variables don't work I am trying to create a like and dislike system for that I have created a model called FeedLike here I can like and dislike using simple create and destroy but when I am using ajax and there I am calling this action below :
$('#feed_like').html("<%= j render :partial => 'shared/dislike', :locals => { feed: @feed= @feed} %>");
I am getting the error No route matches
{:action=>"destroy", :controller=>"feed_likes", :feed_id=>nil, :user_id=>1}
And my dislike link is like this it is a partial which is under :
<div id="feed_dislike">
<%= link_to "Dislike",{ :action => 'destroy', :controller => 'feed_likes', :feed_id => @feed, :user_id => current_user.id }, class: "btn btn-primary" %>
</div>
everything work fine when I am not using ajax but when I am rendering partial why @feed is not getting any value what am I supposed to do . To get the value of feed.id . feed.id is coming from and model called Feed and it is under look and there I am rendering these two forms using partials .
now I am pasting some codes which will give you what I am doing :
#shared/_feed.html.erb
<% if @feed_items.try(:any?) %>
<ol class="microposts">
<%= render @feed_items %>
</ol>
<%= will_paginate @feed_items %>
<% end %>
And @feed_items is coming from :
#feeds/_feed.html.erb
<li id="feed-<%= feed.id %>">
<%= image_tag(current_user.avatar.url(:thumb), :size => '50x50') %>
<span class="user"><%= link_to feed.user.name, feed.user %></span>
<span class="content"><%= feed.content %></span>
<span class="timestamp">
Posted <%= time_ago_in_words(feed.created_at) %> ago.
</span>
<% @like =FeedLike.where(:user_id => "#{current_user.id}", :feed_id => "#{feed.id}")
%>
<%= render :partial => 'shared/feed_like', locals: { feed: @feed= feed.id} %>
</li>
And now feed_like partial :
#shared/_feed_like.html.erb
<% if @like.count == 0 %>
<%= render :partial => 'shared/like', locals: { feed1: @feed= @feed} %>
<% else %>
<%= render :partial => 'shared/dislike', locals: { feed: @feed} %>
<% end %>
Controllers code for :
class FeedsController < ApplicationController
before_action :authenticate_user! ,only: [:create, :destroy]
def create
@feed = current_user.feeds.build(feed_params)
@feed_likes = FeedLike.new
if @feed.save
#redirect_to root_url
respond_to do |format|
format.html { redirect_to root_url }
format.js
end
else
respond_to do |format|
format.html { redirect_to root_url }
format.js { render :js=>'alert("you can not leave post empty");' }
end
end
end
def destroy
end
private
def feed_params
params.require(:feed).permit(:content)
end
end
FeedsLike controller :
class FeedLikesController < ApplicationController
before_action :authenticate_user! ,only: [:create, :destroy]
def index
@fees = FeedLike.all
respond_to do |format|
format.html
format.js
end
end
def update
@feed_likes = FeedLike.find_or_create_by(feed_like_params)
respond_to do |format|
if @feed_likes.save
format.html { redirect_to root_url, notice: 'Like ' }
else
end
end
end
def create
@feed_likes = FeedLike.find_or_create_by(:feed_id => params[:feed_id],:user_id =>params[:user_id])
respond_to do |format|
if @feed_likes.save
format.html { redirect_to root_url, notice: 'Like ' }
format.js
else
end
end
end
def delete
end
def destroy
@feed_likes = FeedLike.where(:feed_id => params[:feed_id],:user_id =>params[:user_id])
respond_to do |format|
if @feed_likes.destroy_all
format.html { redirect_to root_url, notice: 'Unlike ' }
else
end
end
end
def feed_like_params
params.require(:feed_like).permit(:user_id, :feed_id)
#params[:market_place]
end
end
And staticpage controller :
class StaticPagesController < ApplicationController
before_action :authenticate_user!
def home
if user_signed_in?
@feed_likes = current_user.feed_likes.new
@feed = current_user.feeds.build
@feed_items = current_user.feed.paginate(page: params[:page])
# @likes = Feed.find(:all,
# :select => '"feeds".id, "feeds".content, count("feed_likes".id) as Like',
# :from => :feeds,
# :left_join => '"feed_likes"',
# :on => '"feeds".id = "feed_likes"."feed".id',
# :limit => 5
# )
# @like =Feed.find_by_sql "
# SELECT id
# FROM feed_likes
# WHERE user_id = #{current_user.id}
# AND feed_id =#{feed.id}
# LIMIT 0 , 30
# "
end
end
def help
end
def about
end
def contact
end
end
your feed is nil which is why it is crashing
please add this in your feed_likes controller.
before_action :get_feed ,only: [:create, :destroy]
and at the bottom add this method
def get_feed
@feed= Feed.find(params[:feed_id])
end