Rails:已完成500内部服务器错误,使用AngularJS $ http.post调用

时间:2015-02-15 07:50:51

标签: ruby-on-rails ajax angularjs ruby-on-rails-4

我目前正在撰写本教程:AngularJS Tutorial: Learn to Build Modern Web Apps with Angular and Rails

在教程项目中,用户可以为帖子创建博客帖子评论。到目前为止,我已经能够创建博客帖子(保存到数据库中),但是当我尝试为帖子<创建评论时/ strong>,然后我得到以下错误

Started POST "/posts/16/comments.json" for 127.0.0.1 at 2015-02-15 08:32:40 +0200
Processing by CommentsController#create as JSON
  Parameters: {"body"=>"6", "author"=>"user", "post_id"=>"16", "comment"=>{"body"=>"6"}}
Comments create action entered... 6
Completed 500 Internal Server Error in 9ms

NameError (undefined local variable or method `post' for #<CommentsController:0xb6036e50>):
  app/controllers/comments_controller.rb:6:in `create'

注意:行 “注释创建操作已输入... 6 “logger.info消息。

截图

enter image description here

comments_controller.rb

class CommentsController < ApplicationController

  def create
        logger.info "Comments create action entered... " + params[:body]

    comment = post.comments.create(comment_params)

    respond_with post, comment
  end

  def upvote
    comment = post.comments.find(params[:id])
    comment.increment!(:upvotes)

    respond_with post, comment
  end

  private
  def comment_params
    params.require(:comment).permit(:body)
  end
end

posts_controller.rb

class PostsController < ApplicationController

  def index
    respond_with Post.all
  end

  def create
    respond_with Post.create(post_params)
  end

  def show
       logger.info "show action entered... " + params[:id]

    #respond_with Post.find(params[:id])
    #the code below works,  the line above resulted in error: 406 (Not Acceptable)
    render json: Post.find(params[:id]).to_json 
  end

  def upvote
    post = Post.find(params[:id])
    post.increment!(:upvotes)

    respond_with post
  end

  private

  def post_params
    logger.info "post_params entered..."
    params.require(:post).permit(:link, :title)
  end
end

PostsController show操作中,我之前已将行respond_with Post.find(params[:id])更改为:render json: Post.find(params[:id]).to_json,因为行:respond_with Post.find(params[:id])产生了错误:GET http://0.0.0.0:3000/posts/4 406 (Not Acceptable)

我不确定,但上述问题可能与内部错误(500)消息有关,为什么找不到帖子。此外,如果我在respond_with Post.find(params[:id])中使用行PostsController,那么我仍然会在评论创建时遇到同样的问题。

application_controller.rb

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception

  respond_to :json

  def angular
    render 'layouts/application'
  end
end

的routes.rb

FlapperNews::Application.routes.draw do

  root to: 'application#angular'

  resources :posts, only: [:create, :index, :show] do
    resources :comments, only: [:show, :create] do
      member do
        put '/upvote' => 'comments#upvote'
      end
    end

    member do
      put '/upvote' => 'posts#upvote'
    end
  end
end

以下是执行Ajax调用的 post.js 文件,o.addComment函数的$http.post调用尝试按以下方式创建注释: $http.post('/posts/' + id + '/comments.json', comment);

angular.module('flapperNews').factory('posts', ['$http',
    function($http){
       var o = {
            posts: []
        };

     o.getAll = function() {
            return $http.get('/posts.json').success(function(data){
                angular.copy(data, o.posts);
            });
        };
        o.create = function(post) {
            console.log("o.create");
            return $http.post('/posts.json', post).success(function(data){
                o.posts.push(data);
            });
        };
        o.upvote = function(post) {
          return $http.put('/posts/' + post.id + '/upvote.json')
            .success(function(data){
              post.upvotes += 1;
            });
        };
        o.get = function(id) {
          return $http.get('/posts/' + id).then(function(res){
            return res.data;
          });
        };
        o.addComment = function(id, comment) {
            console.log("addComment " + id + ", comments " + comment )
          return $http.post('/posts/' + id + '/comments.json', comment);
        };
        o.upvoteComment = function(post, comment) {
            console.log("o.upvoteComment " + post.id + ", comments " +comment.id)
          return $http.put('/posts/' + post.id + '/comments/'+ comment.id + '/upvote.json')
            .success(function(data){
              comment.upvotes += 1;
            });
        };
        return o; 
    }
]);

app.js

angular.module('flapperNews', ['ui.router', 'templates'])
.config([
  '$stateProvider',
  '$urlRouterProvider',
  function($stateProvider, $urlRouterProvider) {
    $stateProvider
      .state('home', {
        url: '/home',
        templateUrl: 'home/_home.html',
        controller: 'MainCtrl',
        resolve: {
          postPromise: ['posts', function(posts){
            return posts.getAll();
          }]
        }
      })
      .state('posts', {
        url: '/posts/{id}',
        templateUrl: 'posts/_posts.html',
        controller: 'PostsCtrl',
        resolve: {
          post: ['$stateParams', 'posts', function($stateParams, posts) {
            console.log( "$stateParams.id " +$stateParams.id)
            return posts.get($stateParams.id);
          }]
        }

      })
    $urlRouterProvider.otherwise('home')
}]);

我的rails版本是4.0.2

任何帮助都会受到赞赏,因为我已经在几个小时内对代码进行了挣扎:-)无论如何,我很高兴有Stackoverflow论坛可以提出一些建议:-)

1 个答案:

答案 0 :(得分:3)

首先,这与角度无关。您没有定义帖子,因此请添加:

post = Post.find params[:post_id]

另外,我认为你的评论属于发帖,你应该在保存评论之前将帖子设置为评论的帖子,所以:

@comment.post = post