Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails:未定义的方法“-';零级:零级_Ruby On Rails_Ruby_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails RubyonRails:未定义的方法“-';零级:零级

Ruby on rails RubyonRails:未定义的方法“-';零级:零级,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我正在尝试将save\u with_initial\u vote方法添加到我的Post类中。它应该保存帖子并在事务中创建投票 我的post.rb如下所示: class Post < ActiveRecord::Base has_one :summary has_many :comments, dependent: :destroy has_many :votes, dependent: :destroy belongs_to :use

我正在尝试将
save\u with_initial\u vote
方法添加到我的
Post
类中。它应该保存帖子并在事务中创建投票

我的
post.rb
如下所示:

    class Post < ActiveRecord::Base
      has_one :summary
      has_many :comments, dependent: :destroy
      has_many :votes, dependent: :destroy
      belongs_to :user
      belongs_to :topic
      mount_uploader :image, ImageUploader
      def up_votes
        votes.where(value: 1).count
      end
      def down_votes
        votes.where(value: -1).count
      end
      def points
        votes.sum(:value)
      end
      def update_rank
        age_in_days = (created_at - Time.new(1970,1,1)) / (60 * 60 * 24) # 1 day in seconds
        new_rank = points + age_in_days
        update_attribute(:rank, new_rank)
      end
      default_scope { order('rank DESC') }
      scope :ordered_by_title, -> { order('posts.title ASC') }
      scope :ordered_by_reverse_created_at, -> { order('posts.created_at DESC') }
        validates :title, length: { minimum: 5 }, presence: true
        validates :body, length: { minimum: 20 }, presence: true
        validates :topic, presence: true
        validates :user, presence: true
        def markdown_title
          render_as_markdown(self.title)
        end
        def markdown_body
          render_as_markdown(self.body)
        end
        def create_vote
          user.votes.create(value: 1, post: self)
        end
        def save_with_initial_vote
          ActiveRecord::Base.transaction do
            save
            user.votes.create(value: 1, post: self)
          end 
        end 

        private

        def render_as_markdown(markdown)
          renderer = Redcarpet::Render::HTML.new
          extensions = {fenced_code_blocks: true}
          redcarpet = Redcarpet::Markdown.new(renderer, extensions)
          (redcarpet.render markdown).html_safe
        end
    end
class PostsController < ApplicationController
  def show
    @topic = Topic.find(params[:topic_id])
    authorize @topic
    @post = Post.find(params[:id])
    @comments = @post.comments
  end
  def new
     @topic = Topic.find(params[:topic_id])
    @post = Post.new
    authorize @post
  end
  def edit
     @topic = Topic.find(params[:topic_id])
    @post = Post.find(params[:id])
    authorize @post
  end
  def create
    @topic = Topic.find(params[:topic_id])
    @post = current_user.posts.build(post_params)
    authorize @post
    if @post.save_with_initial_vote
      flash[:notice] = "Post was saved."
      redirect_to [@topic, @post]
    else
      flash[:error] = "There was an error saving the post. Please try again."
      render :new
    end
  end
  def update
     @topic = Topic.find(params[:topic_id])
    @post = Post.find(params[:id])
    authorize @post
    if @post.update_attributes(post_params)
      flash[:notice] = "Post was updated."
      redirect_to [@topic, @post]
    else
      flash[:error] = "There was an error saving the post. Please try again."
      render :new
    end
  end
  def destroy
    @topic = Topic.find(params[:topic_id])
    @post = Post.find(params[:id])
    authorize @post
    if @post.destroy
      flash[:notice] = "\"#{@post.title}\" was deleted."
      redirect_to @topic
    else
      flash[:error] = "There was an error deleting your post. Please try again."
      render :show
    end
  end

  private

  def post_params
    params.require(:post).permit(:title, :body, :image)
  end
end
class Vote < ActiveRecord::Base
  belongs_to :user
  belongs_to :post
  validates :value, inclusion: {in: [-1, 1], message: "%{value} is not a valid vote." }
  after_save :update_post

  private

  def update_post
    post.update_rank
  end
end
我的
vote.rb
如下所示:

    class Post < ActiveRecord::Base
      has_one :summary
      has_many :comments, dependent: :destroy
      has_many :votes, dependent: :destroy
      belongs_to :user
      belongs_to :topic
      mount_uploader :image, ImageUploader
      def up_votes
        votes.where(value: 1).count
      end
      def down_votes
        votes.where(value: -1).count
      end
      def points
        votes.sum(:value)
      end
      def update_rank
        age_in_days = (created_at - Time.new(1970,1,1)) / (60 * 60 * 24) # 1 day in seconds
        new_rank = points + age_in_days
        update_attribute(:rank, new_rank)
      end
      default_scope { order('rank DESC') }
      scope :ordered_by_title, -> { order('posts.title ASC') }
      scope :ordered_by_reverse_created_at, -> { order('posts.created_at DESC') }
        validates :title, length: { minimum: 5 }, presence: true
        validates :body, length: { minimum: 20 }, presence: true
        validates :topic, presence: true
        validates :user, presence: true
        def markdown_title
          render_as_markdown(self.title)
        end
        def markdown_body
          render_as_markdown(self.body)
        end
        def create_vote
          user.votes.create(value: 1, post: self)
        end
        def save_with_initial_vote
          ActiveRecord::Base.transaction do
            save
            user.votes.create(value: 1, post: self)
          end 
        end 

        private

        def render_as_markdown(markdown)
          renderer = Redcarpet::Render::HTML.new
          extensions = {fenced_code_blocks: true}
          redcarpet = Redcarpet::Markdown.new(renderer, extensions)
          (redcarpet.render markdown).html_safe
        end
    end
class PostsController < ApplicationController
  def show
    @topic = Topic.find(params[:topic_id])
    authorize @topic
    @post = Post.find(params[:id])
    @comments = @post.comments
  end
  def new
     @topic = Topic.find(params[:topic_id])
    @post = Post.new
    authorize @post
  end
  def edit
     @topic = Topic.find(params[:topic_id])
    @post = Post.find(params[:id])
    authorize @post
  end
  def create
    @topic = Topic.find(params[:topic_id])
    @post = current_user.posts.build(post_params)
    authorize @post
    if @post.save_with_initial_vote
      flash[:notice] = "Post was saved."
      redirect_to [@topic, @post]
    else
      flash[:error] = "There was an error saving the post. Please try again."
      render :new
    end
  end
  def update
     @topic = Topic.find(params[:topic_id])
    @post = Post.find(params[:id])
    authorize @post
    if @post.update_attributes(post_params)
      flash[:notice] = "Post was updated."
      redirect_to [@topic, @post]
    else
      flash[:error] = "There was an error saving the post. Please try again."
      render :new
    end
  end
  def destroy
    @topic = Topic.find(params[:topic_id])
    @post = Post.find(params[:id])
    authorize @post
    if @post.destroy
      flash[:notice] = "\"#{@post.title}\" was deleted."
      redirect_to @topic
    else
      flash[:error] = "There was an error deleting your post. Please try again."
      render :show
    end
  end

  private

  def post_params
    params.require(:post).permit(:title, :body, :image)
  end
end
class Vote < ActiveRecord::Base
  belongs_to :user
  belongs_to :post
  validates :value, inclusion: {in: [-1, 1], message: "%{value} is not a valid vote." }
  after_save :update_post

  private

  def update_post
    post.update_rank
  end
end

要解决问题,请从查找错误源开始。错误为“未定义的方法”-“对于nil:NilClass”。 这意味着你试图从一个事实上为零的对象中减去。 当您尝试保存投票时,在Vote.rb模型中,在保存后调用update_post。这将在Post模型中调用update_rank方法。然后,此方法从“created_at”中减去时间对象。因此,问题在于created_返回的值为零

您可以尝试使用gem更好地调试代码。然后,您可以在模型/控制器代码中的任意位置添加“binding.pry”,并逐行查看每一行,以查看此时每个变量的值