My partial, which is located in views/votes/_voter.html.erb, is not rendering in the browser and not triggering any errors when I place the rendering code in the answers/show.html.erb file. I've already combed through all of the questions and answers related to partials in rails on SO, and can't find anything exactly related to what is happening here. If anyone can help shed any light on the problem, I'd really appreciate it!
answers/show.html.erb file:
<p id="notice"><%= notice %></p>
<%= render partial: 'votes/voter', locals: { answer: @answer } %>
<p>
<strong>Body:</strong>
<%= @answer.body %>
</p>
<%= link_to 'Edit', edit_answer_path(@answer) %> |
<%= link_to 'Back', answers_path %>
views/votes/_voter.html.erb file:
<% if policy( Vote.new ).create? %>
<div class="vote-arrows pull-left">
<div>
<%= link_to " ",
post_up_vote_path(answer),
class: "glyphicon glyphicon-chevron-up #{(current_user.voted(answer) && current_user.voted(answer).up_vote?) ? 'voted' : '' }", method: :post %>
</div>
<div>
<strong><%= answer.points %></strong>
</div>
<div>
<%= link_to " ",
post_down_vote_path(answer),
class: "glyphicon glyphicon-chevron-down #{(current_user.voted(answer) && current_user.voted(answer).down_vote?) ? 'voted' : '' }" , method: :post%>
</div>
</div>
<% end %>
votes_controller.rb:
class VotesController < ApplicationController
before_action :load_answer_and_vote
def up_vote
if @vote
@vote.update_attribute(:value, 1)
else
@vote = current_user.votes.create(value: 1, answer: @answer)
end
redirect_to :back
end
def down_vote
if @vote
@vote.update_attribute(:value, -1)
else
@vote = current_user.votes.create(value: -1, answer: @answer)
end
redirect_to :back
end
private
def load_answer_and_vote
@question = Question.find(params[:question_id])
@vote = @question.votes.where(user_id: current_user.id).first
end
def update_vote(new_value)
if @vote
authorize @vote, :update?
@vote.update_attribute(:value, new_value)
else
@vote = current_user.votes.build(value: new_value, answer: @answer)
authorize @vote, :create?
@vote.save
end
end
end
vote.rb model:
class Vote < ActiveRecord::Base
belongs_to :user
belongs_to :answer, dependent: :destroy
default_scope { order('created_at DESC') }
validates :user, presence: true
validates :answer, presence: true
validates :value, inclusion: { in: [-1, 1], message: "%{value} is not a valid vote." }
after_save :update_answer
def up_vote?
value == 1
end
def down_vote?
value == -1
end
private
def update_post
answer.update_rank
end
end
routes.rb
Languagecheck::Application.routes.draw do
devise_for :users
resources :users
resources :languages do
resources :questions, except: [:index] do
resources :answers
post '/up-vote' => 'votes#up_vote', as: :up_vote
post '/down-vote' => 'votes#down_vote', as: :down_vote
end
end
resources :questions, only: [:index, :new, :create]
get 'about' => 'welcome#about'
root to: 'welcome#index'
end
It looks like you need to be signed in to view the partial.
<% if policy( Vote.new ).create? %>
Do you need to be signed in to vote? Are you signed in? If you are not you wouldn't see this partial.
The other place to check is your vote authorization policies to ensure they are set up correctly.
It turned out that I needed to render the partial in the views/questions/show.html file. Here is what I did to get the desired outcome:
<h3>Question</h3>
<div class="row">
<div class="col-md-8">
<p><%= @question.body %></p>
<small>
<%= image_tag(@question.user.avatar.tiny.url) if @question.user.avatar? %>
submitted <%= time_ago_in_words(@question.created_at) %> ago by
<%= @question.user.name %>
</small>
</div>
<div class="col-md-4">
<% if policy(@question).edit? %>
<%= link_to "Edit Question", edit_language_question_path(@language, @question), class: 'btn btn-success' %>
<% end %>
</div>
</div>
<br/>
<h3>Answers</h3>
<% @question.answers.each do |answer| %>
<%= render partial: 'votes/voter', locals: { answer: @answer } %>
<div>
<h3>
<%= pluralize(@answer.points, 'point') %>
</h3>
<small>
<%= pluralize(@answer.up_votes, 'up vote') %>
<%= pluralize(@answer.down_votes, 'down vote') %>
</small>
</div>
<%= simple_format answer.body %>
<small>
<%= image_tag(answer.user.avatar.tiny.url) if answer.user.avatar? %>
submitted <%= time_ago_in_words(answer.created_at) %> ago by
<%= answer.user.name %>
</small>
<% end %>
<br/>
<h4>Add an Answer</h4>
<%= render "answers/form" %>
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.