我的视图中有一个ajax调用,当我点击upvote / downvote按钮(应该是POST http请求)时触发。但是,AJAX返回内部500错误(我认为这是因为没有投票视图文件)
控制器文件
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<p><span maxlength="10" value="1" contenteditable="true" data-store="#yourtext"></span></p>
<input type="hidden" id="yourtext" name="yourtext" />
<p>The hidden input value: <b><span id="current_value"></span></b></p>
使用AJAX查看文件
class PostsController < ApplicationController
def vote
PostsVote.create(
user_id: session[:id],
post_id: vote_params[:post_id].to_i,
vote: vote_params[:vote].to_i)
@post = Post.find(vote_params[:post_id])
votes_total = @post.posts_votes.sum(:vote)
{post_id: @post.id, votes: votes_total}.to_json
end
private
def vote_params
params.permit(:post_id, :vote)
end
end
非常感谢任何帮助。
答案 0 :(得分:1)
你是对的;你得到错误是因为Rails试图渲染投票视图,而这个视图并不存在。由于您未在render
操作中调用redirect_to
或vote
,因此Rails默认会尝试呈现模板。
看起来你只想用JSON回复,你可以这样做:
def vote
PostsVote.create(
user_id: session[:id],
post_id: vote_params[:post_id].to_i,
vote: vote_params[:vote].to_i)
@post = Post.find(vote_params[:post_id])
votes_total = @post.posts_votes.sum(:vote)
render json: {post_id: @post.id, votes: votes_total} # to_json is called automatically
end
我已经假设这个动作总是通过Ajax调用,并且总是希望返回JSON。如果您要有多种类型的回复,则需要respond_to
块。 Here's an example with respond_to
from the official guides.