ruby-on-rails - 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
解决方案
我认为您需要修改此方法
def popular_post
self.posts.max_by do |a|
a.likes
end
end
max_by
是一个 Enumerable 类的方法,你在 Post 类上调用它,所以这将无法正常工作。我建议你使用类似posts.order('likes DESC').first
if likes
is an Integer 的东西。
还有一点提示,您不需要self
在对象和类方法中使用所有这些。如果这是一个对象方法,Rails 会假设你在一个对象上调用它,或者如果这是一个类方法,你在一个关系上调用它。
推荐阅读
- google-app-engine - 无法使用 Github 操作部署到 Google App Engine - 未提供凭据
- python - 姜戈。头像的模型函数
- java - 错误:找不到符号 Upload upload = new Upload(editTextName.getText().toString().trim(), taskSnapshot.getDownloadUrl().toString());
- spring - spring websocket/stomp + rabbitmq - convertAndSend,队列的目标路径
- swift - 将应用与 Audiounit、AUv3 协议集成
- laravel - Laravel 帆如何删除创建的应用程序
- git - Git - 向我的项目添加新功能,但尚未上线。需要进行快速更新并上线,但没有新功能
- mysql - 读取查询上的 AWS RDS mysql 死锁
- javascript - 如何在Angular中为以下案例编写开关案例的测试用例
- r - 如何解决R中reduce函数的问题