heinous_inline_partial for story show perf
This commit is contained in:
parent
8dd88017a8
commit
dacbbb86fa
|
@ -3,9 +3,10 @@ class ApplicationController < ActionController::Base
|
||||||
|
|
||||||
protect_from_forgery
|
protect_from_forgery
|
||||||
before_action :authenticate_user
|
before_action :authenticate_user
|
||||||
|
before_action :heinous_inline_partials, if: -> { Rails.env.development? }
|
||||||
before_action :mini_profiler
|
before_action :mini_profiler
|
||||||
before_action :set_traffic_style
|
|
||||||
before_action :prepare_exception_notifier
|
before_action :prepare_exception_notifier
|
||||||
|
before_action :set_traffic_style
|
||||||
|
|
||||||
# match this in your nginx config for bypassing the file cache
|
# match this in your nginx config for bypassing the file cache
|
||||||
TAG_FILTER_COOKIE = :tag_filters
|
TAG_FILTER_COOKIE = :tag_filters
|
||||||
|
@ -72,6 +73,10 @@ class ApplicationController < ActionController::Base
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def heinous_inline_partials
|
||||||
|
do_heinous_inline_partial_replacement
|
||||||
|
end
|
||||||
|
|
||||||
def mini_profiler
|
def mini_profiler
|
||||||
if @user && @user.is_admin?
|
if @user && @user.is_admin?
|
||||||
Rack::MiniProfiler.authorize_request
|
Rack::MiniProfiler.authorize_request
|
||||||
|
|
|
@ -56,12 +56,170 @@
|
||||||
<% end %>
|
<% end %>
|
||||||
<% previous_depth = comment.depth %>
|
<% previous_depth = comment.depth %>
|
||||||
|
|
||||||
<%= render "comments/comment", :comment => comment,
|
<%
|
||||||
:show_story => (comment.story_id != @story.id),
|
show_story = (comment.story_id != @story.id)
|
||||||
:show_tree_lines => true,
|
show_tree_lines = true
|
||||||
:was_merged => (comment.story_id != @story.id),
|
was_merged = (comment.story_id != @story.id)
|
||||||
:children => [],
|
is_unread = is_unread?(comment)
|
||||||
:is_unread => is_unread?(comment) %>
|
%>
|
||||||
|
<%#heinous_inline_partial(comments/_comment.html.erb)%>
|
||||||
|
<%# Do not edit, the content until /heinous_inline_partial comes from the named partial %>
|
||||||
|
<% flagged = comment.current_vote && comment.current_vote[:vote] == -1 %>
|
||||||
|
<input id="comment_folder_<%= comment.short_id %>"
|
||||||
|
class="comment_folder_button" type="checkbox"
|
||||||
|
<%= defined?(force_open) ||
|
||||||
|
@user.try(:is_moderator?) ||
|
||||||
|
(comment.score > Comment::COLLAPSE_SCORE && !flagged) ? "" : "checked" %>>
|
||||||
|
|
||||||
|
<div id="c_<%= comment.short_id %>"
|
||||||
|
data-shortid="<%= comment.short_id if comment.persisted? %>"
|
||||||
|
class="comment <%= comment.current_vote ? (comment.current_vote[:vote] == 1 ?
|
||||||
|
"upvoted" : "flagged") : "" %>
|
||||||
|
<%= comment.score < Comment::SCORE_RANGE_TO_HIDE.first ? "bad" : "" %>">
|
||||||
|
|
||||||
|
<% if defined?(show_tree_lines) && show_tree_lines %>
|
||||||
|
<label for="comment_folder_<%= comment.short_id %>"
|
||||||
|
class="comment_folder"></label>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% if !comment.is_gone? %>
|
||||||
|
<% can_flag = @user && @user.can_flag?(comment) %>
|
||||||
|
<% score_display = comment.score_for_user(@user) %>
|
||||||
|
<div class="voters">
|
||||||
|
<% if @user %>
|
||||||
|
<a class="upvoter"></a>
|
||||||
|
<% else %>
|
||||||
|
<%= link_to "", login_path, :class => "upvoter" %>
|
||||||
|
<% end %>
|
||||||
|
<div class="score"><%= score_display %></div>
|
||||||
|
</div>
|
||||||
|
<div class="comment_parent_tree_line
|
||||||
|
<%= can_flag ? "can_flag" : "" %>
|
||||||
|
<%= score_display != " " ? "score_shown" : "" %>
|
||||||
|
<%= defined?(children) && children ? "" : "no_children" %>"></div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<div class="details">
|
||||||
|
<div class="byline">
|
||||||
|
<a name="c_<%= comment.short_id %>"></a>
|
||||||
|
|
||||||
|
<% if defined?(show_tree_lines) && show_tree_lines %>
|
||||||
|
<label for="comment_folder_<%= comment.short_id %>"
|
||||||
|
class="comment_folder comment_folder_inline"></label>
|
||||||
|
<% else %>
|
||||||
|
<label for="comment_folder_<%= comment.short_id %>"
|
||||||
|
class="comment_folder comment_folder_inline force_inline"></label>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% if defined?(was_merged) && was_merged %>
|
||||||
|
<span class="merge"></span>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% if (@user && @user.show_avatars?) || !@user %>
|
||||||
|
<a href="/u/<%= comment.user.username %>"><%=
|
||||||
|
avatar_img(comment.user, 16) %></a>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<a href="/u/<%= comment.user.username %>"
|
||||||
|
class="<%= comment.html_class_for_user %>"><%=
|
||||||
|
comment.user.username %></a>
|
||||||
|
|
||||||
|
<% if comment.hat %>
|
||||||
|
<%= comment.hat.to_html_label %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% if comment.previewing %>
|
||||||
|
previewed
|
||||||
|
just now
|
||||||
|
<% else %>
|
||||||
|
<% if comment.has_been_edited? %>
|
||||||
|
edited
|
||||||
|
<% elsif comment.is_from_email? %>
|
||||||
|
e-mailed
|
||||||
|
<% end %>
|
||||||
|
<% is_unread ||= false %>
|
||||||
|
<%= time_ago_in_words_label(comment.has_been_edited? ? comment.updated_at : comment.created_at) %>
|
||||||
|
<%= raw "<span class='comment_unread'>(unread)</span>" if is_unread %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% if !comment.previewing %>
|
||||||
|
|
|
||||||
|
<a href="<%= comment.path %>">link</a>
|
||||||
|
|
||||||
|
<% if comment.is_editable_by_user?(@user) %>
|
||||||
|
|
|
||||||
|
<a tabindex="0" class="comment_editor">edit</a>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% if comment.is_gone? && comment.is_undeletable_by_user?(@user) %>
|
||||||
|
|
|
||||||
|
<a tabindex="0" class="comment_undeletor" href="#c_<%= comment.short_id %>">undelete</a>
|
||||||
|
<% elsif !comment.is_gone? && comment.is_deletable_by_user?(@user) %>
|
||||||
|
|
|
||||||
|
<% if @user && @user.is_moderator? && @user.id != comment.user_id %>
|
||||||
|
<a tabindex="0" class="comment_moderator" href="#c_<%= comment.short_id %>">delete</a>
|
||||||
|
<% else %>
|
||||||
|
<a tabindex="0" class="comment_deletor" href="#c_<%= comment.short_id %>">delete</a>
|
||||||
|
<% end %>
|
||||||
|
<% elsif !comment.is_gone? && comment.is_disownable_by_user?(@user) %>
|
||||||
|
|
|
||||||
|
<a tabindex="0" class="comment-disowner" href="#">disown</a>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% if can_flag && !flagged %>
|
||||||
|
<span class="dropdown_parent">
|
||||||
|
| <a class="flagger">flag</a>
|
||||||
|
</span>
|
||||||
|
<% elsif flagged %>
|
||||||
|
| <a class="flagger">unflag</a>
|
||||||
|
<% else %>
|
||||||
|
<span class="flagger flagger_stub"></span>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% if @user && !comment.is_gone? && comment.story.accepting_comments? %>
|
||||||
|
|
|
||||||
|
<a tabindex="0" class="comment_replier" unselectable="on">reply</a>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% if defined?(show_story) && show_story %>
|
||||||
|
| on:
|
||||||
|
<a href="<%= comment.story.comments_path %>"><%= comment.story.title %></a>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<span class="reason">
|
||||||
|
<% if comment.flags > 0 &&
|
||||||
|
comment.show_score_to_user?(@user) &&
|
||||||
|
(comment.user_id == @user.try(:id) || @user.try("is_moderator?")) %>
|
||||||
|
<% if (s = comment.vote_summary_for_user(@user).downcase).present? %>
|
||||||
|
| <%= s %>
|
||||||
|
<% end %>
|
||||||
|
<% elsif comment.current_vote && comment.current_vote[:vote] == -1 %>
|
||||||
|
| -1
|
||||||
|
<%= Vote::ALL_COMMENT_REASONS[comment.current_vote[:reason]].downcase %>
|
||||||
|
<% end %>
|
||||||
|
</span>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
<div role="heading" aria-level="3" class="comment_text">
|
||||||
|
<% if comment.is_gone? %>
|
||||||
|
<p>
|
||||||
|
<span class="na">
|
||||||
|
[<%= comment.gone_text %><% if @user && @user.is_moderator? %> Visible to moderator:<% end %>]
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
<% if @user && @user.is_moderator? %>
|
||||||
|
<%= raw comment.markeddown_comment %>
|
||||||
|
<% end %>
|
||||||
|
<% else %>
|
||||||
|
<%= raw comment.markeddown_comment %>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%#/heinous_inline_partial(comments/_comment.html.erb)%>
|
||||||
|
%>
|
||||||
|
%>
|
||||||
|
|
||||||
<%#
|
<%#
|
||||||
# If you edit this structure, update the incredibly brittle css selector
|
# If you edit this structure, update the incredibly brittle css selector
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
# Inlines partials into parent templates for performance.
|
||||||
|
# In production & test: once at startup; development: every request
|
||||||
|
#
|
||||||
|
# Inlining the comments/_comment partial into stories/show (bulk of our traffic!)
|
||||||
|
# gives a 25% speedup over 'render collection: @comment'.
|
||||||
|
|
||||||
|
HEINOUS_INLINE_PARTIALS = {
|
||||||
|
# including template => partial
|
||||||
|
}
|
||||||
|
|
||||||
|
Dir['app/views/**/*.erb'].each do |filename|
|
||||||
|
template = File.read(filename)
|
||||||
|
next unless template.include? 'heinous_inline_partial'
|
||||||
|
|
||||||
|
partial_match = template.match(/^<%#heinous_inline_partial\(([\w\/\.]+)\)%>/)
|
||||||
|
partial_name = partial_match && partial_match.captures.first
|
||||||
|
HEINOUS_INLINE_PARTIALS[filename] = 'app/views/' + partial_name
|
||||||
|
end
|
||||||
|
l = Logger.new(STDOUT)
|
||||||
|
l.warn "heinous_inline_partial initialized, found: #{HEINOUS_INLINE_PARTIALS}"
|
||||||
|
|
||||||
|
def do_heinous_inline_partial_replacement
|
||||||
|
HEINOUS_INLINE_PARTIALS.each do |filename, partial_name|
|
||||||
|
partial_mtime = File.mtime(partial_name)
|
||||||
|
# puts "heinous contemplating #{filename} #{File.mtime(filename).to_i} #{partial_mtime.to_i}"
|
||||||
|
next if File.mtime(filename) == partial_mtime
|
||||||
|
# puts " will replace in #{filename}"
|
||||||
|
|
||||||
|
template = File.read(filename)
|
||||||
|
template.sub!(/^<%#heinous_inline_partial\(([\w\/\.]+)\)%>(.+)^<%#\/heinous_inline_partial\(([\w\/\.]+)\)/m) { |match|
|
||||||
|
raise "Template name didn't match in open and closing tags. One per file!" unless $1 == $3
|
||||||
|
# puts " .sub! matched, replacing"
|
||||||
|
|
||||||
|
<<~REPLACE
|
||||||
|
<%#heinous_inline_partial(#{$1})%>
|
||||||
|
<%# Do not edit, the content until /heinous_inline_partial comes from the named partial %>
|
||||||
|
#{File.read(partial_name)}
|
||||||
|
<%#/heinous_inline_partial(#{$1})%>
|
||||||
|
REPLACE
|
||||||
|
}
|
||||||
|
# puts " writing filename #{filename}"
|
||||||
|
File.write(filename, template)
|
||||||
|
File.utime(partial_mtime, partial_mtime, filename)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# run once at startup:
|
||||||
|
do_heinous_inline_partial_replacement
|
||||||
|
|
||||||
|
# see before_action in ApplicationController for development mode hook
|
Loading…
Reference in New Issue