Note that there are some explanatory texts on larger screens.

plurals
  1. POMethod becomes nil after an ajax response?
    primarykey
    data
    text
    <p>The following code does the following: If the user, <strong>voted up</strong> show him a <em>delete vote</em> form and a <em>vote down form</em>. If the user <strong>voted down</strong>, show him a <em>vote up form</em> and the <em>delete vote form</em>. Otherwise just show the <em>vote up and vote down form</em> (I omitted some of the code so the question doesn't get too long).</p> <p><img src="https://i.stack.imgur.com/xwYwZ.png" alt="enter image description here"></p> <p>(scenario: user voted down):</p> <p><strong>posts_controller.rb:</strong></p> <pre><code> def show @post = Post.find(params[:id]) @replies = @post.replies.paginate(page: params[:page]) @reply = @post.replies.build @vote = Vote.new store_location end </code></pre> <p><strong>votes_controller.rb:</strong></p> <pre><code>class VotesController &lt; ApplicationController before_filter :signed_in_user def create @votable = find_votable # Destroy the vote first in case the user already voted if already_voted? @vote = @votable.votes.find_by_user_id(current_user.id) @vote.destroy end @vote = @votable.votes.build(params[:vote]) @vote.user_id = current_user.id @votable.save respond_to do |format| format.html { redirect_back } format.js end end def destroy @votable = find_votable @vote = @votable.votes.find_by_user_id(current_user.id) @vote.destroy @votable.reload respond_to do |format| format.html { redirect_back } format.js end end private def find_votable params.each do |name, value| if name =~ /(.+)_id$/ return $1.classify.constantize.find(value) end end nil end def already_voted? @votable.votes.exists?(:user_id =&gt; current_user.id) end end </code></pre> <p><strong>posts/vote_form</strong></p> <pre><code>&lt;div class="vote-form"&gt; &lt;% if @post.votes.exists?(:user_id =&gt; current_user.id) %&gt; &lt;% if @post.votes.find_by_user_id(current_user.id).polarity == -1 %&gt; &lt;%= form_for ([@post, @vote]), remote: true do |f| %&gt; &lt;%= f.hidden_field :polarity, value: 1 %&gt; &lt;div class="form-actions"&gt; &lt;%= button_tag type: :submit, class: "btn btn-small vote" do %&gt; &lt;i class="icon-thumbs-down"&gt;&lt;/i&gt; Vote up &lt;% end %&gt; &lt;/div&gt; &lt;% end %&gt; &lt;%= form_for ([@post, @post.votes.find_by_user_id(current_user.id)]), method: :delete, remote: true do |f| %&gt; &lt;div class="form-actions"&gt; &lt;%= button_tag type: :submit, class: "btn btn-small btn-primary unvote" do %&gt; &lt;i class="icon-thumbs-up"&gt;&lt;/i&gt; Vote down &lt;% end %&gt; &lt;/div&gt; &lt;% end %&gt; &lt;% end %&gt; </code></pre> <p><strong>votes/create.js:</strong></p> <pre><code>$('#&lt;%= @votable.class.name.downcase %&gt;-&lt;%= @votable.id %&gt; .vote-form').html( "&lt;%= escape_javascript(render('shared/delete_vote')) %&gt;" ); </code></pre> <p><strong>shared/_delete_vote.html.erb:</strong></p> <pre><code>&lt;% if @votable.votes.find_by_user_id(current_user.id).polarity == -1 %&gt; &lt;%= form_for ([@votable, @votable.votes.new]), remote: true do |f| %&gt; &lt;div class="form-actions"&gt; &lt;%= button_tag type: :submit, class: "vote-down btn btn-small" do %&gt; &lt;i class="icon-thumbs-up"&gt;&lt;/i&gt; Vote up &lt;% end %&gt; &lt;/div&gt; &lt;% end %&gt; &lt;%= form_for ([@votable, @vote]), method: :delete, remote: true do |f| %&gt; &lt;div class="form-actions"&gt; &lt;%= button_tag type: :submit, class: "vote-up btn btn-small btn-primary" do %&gt; &lt;i class="icon-thumbs-up"&gt;&lt;/i&gt; Vote down &lt;% end %&gt; &lt;/div&gt; &lt;% end %&gt; &lt;% end %&gt; </code></pre> <p>So, now everything works fine, except that I get this error when I click <em>vote down</em>, and then <em>vote up</em> right after (without refreshing the page):</p> <blockquote> <pre><code>ActionView::Template::Error (undefined method `polarity' for nil:NilClass): 1: &lt;% if @votable.votes.find_by_user_id(current_user.id).polarity == 1 %&gt; 2: &lt;%= form_for ([@votable, @vote]), method: :delete, remote: true do |f| %&gt; </code></pre> </blockquote> <p>What could be the problem?</p> <p><strong>EDIT:</strong></p> <p>I realized that the line in the error message is the problem (not <code>@votable</code>):</p> <pre><code>&lt;% if @votable.votes.find_by_user_id(current_user.id).polarity == 1 %&gt; </code></pre> <p>Strange, I thought it was the same as </p> <pre><code>&lt;% if @post.votes.find_by_user_id(current_user.id).polarity == 1 %&gt; </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload