Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,7 @@ Layout:
Enabled: false

Metrics/BlockLength:
Max: 50
Max: 50

Metrics/MethodLength:
Max: 40
35 changes: 27 additions & 8 deletions app/controllers/messages_controller.rb
Original file line number Diff line number Diff line change
@@ -1,17 +1,25 @@
class MessagesController < ApplicationController
PER_PAGE = 50

# GET /messages or /messages.json
def index
query = params[:q]
if query
# %> and <-> are defined by pg_trgm.
# https://www.postgresql.org/docs/17/pgtrgm.html
@messages = Message.find_by_sql([
'SELECT * FROM messages WHERE body %> ? ORDER BY body <-> ? LIMIT 20',
query, query,
])
unless query
@messages = []
return
end

page = params[:page].to_i
list_ids = get_list_ids(params)

# %> and <-> are defined by pg_trgm.
# https://www.postgresql.org/docs/17/pgtrgm.html
message_where = if Rails.env.production?
Message.where('body %> ? AND list_id IN (?) ORDER BY body <-> ?', query, list_ids, query)
else
@messages = Message.all
Message.where('body LIKE ? AND list_id IN (?)', "%#{query}%", list_ids)
end
@messages = message_where.offset(page * PER_PAGE).limit(PER_PAGE)
end

# GET /messages/1 or /messages/1.json
Expand All @@ -23,4 +31,15 @@ def show
@message = Message.find_by(list_id: list.id, list_seq: params[:list_seq])
end
end

private
def get_list_ids(params)
list_ids = []
['ruby-talk', 'ruby-core', 'ruby-list', 'ruby-dev'].each do |name|
if params[name.tr('-', '_').to_sym] == '1'
list_ids << List.find_by_name(name).id
end
end
list_ids
end
end
43 changes: 31 additions & 12 deletions app/views/messages/index.html.erb
Original file line number Diff line number Diff line change
@@ -1,14 +1,33 @@
<p style="color: green"><%= notice %></p>

<h1>Messages</h1>

<ul>
<% @messages.each do |message| %>
<li>
<% list_name = List.find_by_id(message.list_id).name %>
<%= list_name %>:<%= message.list_seq %>
<%= link_to message.subject, "/#{list_name}/#{message.list_seq}" %>
<small><%= message.body %></small>
</li>
<% end %>
</ul>
<h1>blade.ruby-lang.org</h1>

<%= form_with(method: :get) do |form| %>
<%= form.text_field :q, { value: params[:q] } %>
<%= form.submit "Search" %>

<p>
<%
[
[:ruby_talk, 'ruby-talk (English)'],
[:ruby_core, 'ruby-core (For developing Ruby iself, English)'],
[:ruby_list, 'ruby-list (Japanese)'],
[:ruby_dev, 'ruby-dev (For developing Ruby itself, Japanese)'],
].each do |name, label|
%>
<span>
<%= form.check_box name, {checked: params[name] == '1' } %>
<%= form.label name, label %>
</span>
<% end %>
</p>
<% end %>

<% @messages.each do |message| %>
<div>
<% list_name = List.find_by_id(message.list_id).name %>
<%= list_name %>:<%= message.list_seq %>
<%= link_to message.subject, "/#{list_name}/#{message.list_seq}" %>
<small><%= message.body %></small>
</div>
<% end %>