首页 > 解决方案 > Rails 渲染视图非常缓慢

问题描述

我对 Rails 还是很陌生,在一个实践项目实验室工作,我遇到了一个视图渲染速度很慢的问题。任何和所有的帮助将不胜感激!

我也收到了这个错误:

SystemStackError (stack level too deep):
  
app/models/blogger.rb:23:in `popular_post'
app/views/bloggers/show.html.erb:13:in `_app_views_bloggers_show_html_erb__247812415140953454_70240453389320'

宝石文件

gem 'rails', '~> 5.1.6'
gem 'sqlite3'
gem 'puma', '~> 3.7'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'faker'
gem 'coffee-rails', '~> 4.2'
gem 'turbolinks', '~> 5'
gem 'jbuilder', '~> 2.5'

group :development, :test do
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'capybara', '~> 2.13'
  gem 'selenium-webdriver'
end

group :development do
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '>= 3.0.5', '< 3.2'
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

我的课程是 Blogger、Destination 和 Post ( Blogger -< Post >- Destination)。下面是 Blogger 模型、显示页面和控制器的代码(我还没有编写任何其他代码,除了 Blogger 索引但可以工作并且只是一个列表)

博主.rb

class Blogger < ApplicationRecord
    has_many :destinations
    has_many :posts, through: :destinations
    validates :name, uniqueness: true
    validates :age, numericality: { greater_than: 0, message: ": You're Too Young" }
    validates :bio, length: { :minimum => 30 }

    def self.average_age
        ages = self.all.sum do |blogger|
            blogger.age
        end
        (ages / self.all.count)
    end

    def total_likes
        self.posts.sum do |post|
            post.likes
        end
    end

    def popular_post
        self.posts.max_by do |a|
            a.likes
        end
    end

    def top_five
        self.destinations.sort_by do |destination|
            destination.post_count
        end.take(5)
    end
end

博主展示页面

<h1> <%= @blogger.name %> </h1>

<br />
<p> Age: <%= @blogger.age %> </p>
<br />
<br />
<p> Bio: <%= @blogger.bio %> </p>
<br />


<br />

<%= link_to @blogger.popular_post.title, post_path(@blogger.popular_post) %>

<br />
<%= @blogger.top_five %>

博主控制器

class BloggersController < ApplicationController
   
    def index
        @bloggers = Blogger.all
    end

    def show
        @blogger = Blogger.find(params[:id])
    end
    

    def new
        @blogger = Blogger.new
    end

    def create
        @blogger = Blogger.create(blogger_params) 
        if @blogger.valid?
            @blogger.save
            redirect_to blogger_path(@blogger)
        else
            flash[:my_errors] = @blogger.errors.full_messages
            redirect_to new_blogger_path
            # render :new
        end
    end
    
    private

    def blogger_params
        params.require(:blogger).permit(:name, :bio, :age)
    end
    
    
    
end

标签: ruby-on-railsruby

解决方案


我认为您需要修改此方法

def popular_post
        self.posts.max_by do |a|
            a.likes
        end
    end

max_by是一个 Enumerable 类的方法,你在 Post 类上调用它,所以这将无法正常工作。我建议你使用类似posts.order('likes DESC').firstif likesis an Integer 的东西。

还有一点提示,您不需要self在对象和类方法中使用所有这些。如果这是一个对象方法,Rails 会假设你在一个对象上调用它,或者如果这是一个类方法,你在一个关系上调用它。


推荐阅读