Railsで特定の曜日のリストを作成し、リンクを貼る
(環境)
Rails4.2.2
(1)モデル
rails generate scaffold operation message:string admissiondate:date opedate:date special:string anesthesia:string sex:string patientID:integer patientname:string patientkana:string birthdate:date admissionID:integer memo:text eye:string disease1:string disease2:string disease3:string disease4:string ope1:string ope2:string ope3:string ope4:string instrument:string instrumentmemo:string opeestimatetime:integer begintime:datetime operator:string assist:string inpatientdr:string operoom:string inout:string telephone:string desiredroom:string HBs:string HCV:string HIV:string Wa:string MRSA:string add01:string add02:string add03:string add04:string add05:string add06:string add07:string add08:string add09:string add10:string
(2)config/routes.rb
Rails.application.routes.draw do
get 'static_pages/home'
get 'static_pages/index'
get 'static_pages/help'
get 'operations/midori'
get "/operations/:year:month:day" => "operations#list", :constraints => { :year => /[12][0-9]{3}/, :month => /[01][0-9]/, :day => /[0-3][0-9]/ }, :as => 'operations_list'
resources :operations
root 'operations#index'
end
routes.rb の上から記載した順番に判定されるので、「resources :operations」よりも上の行に、「get ‘operations/midori’」や、
「get “/operations/:year:month:day" => “operations#list", :constraints => { :year => /[12][0-9]{3}/, :month => /[01][0-9]/, :day => /[0-3][0-9]/ }, :as => 'operations_list’」
を記載する。このルーティングの記載方法に苦労した。
(3)app/controllers/operations_controller.rb (一部)
def index
require 'date'
#@operations = Operation.all
#@operations = Operation.order("opedate")
@q = Operation.ransack(params[:q])
@operations = @q.result(distinct: true).order("opedate")
end
def list
@operations = Operation.all
d = Date.new(params[:year].to_i, params[:month].to_i ,params[:day].to_i)
@operations = @operations.where(opedate: d)
end
def midori
@operations = Operation.all
require 'date'
base3 = Date.today
@tuesdays = (base3...base3.next_month).select{ |e| e.tuesday? }
@wednesdays = (base3...base3.next_month).select{ |e| e.wednesday? }
@fridays = (base3...base3.next_month).select{ |e| e.friday? }
@operation_weekdays = (base3...base3.next_month).select{ |e| e.tuesday? || e.wednesday? || e.friday? }
end
list では、localhost:3000/operations/20160722 というアドレスをブラウザに入力したときに、2016年7月22日の手術のリストが表示されるようにしている。
midori では、本日から3か月後までの火曜日、水曜日、金曜日のみの日付を、@operation_weekdays として取得している。
(4)app/views/operations/midori.html.erb (一部)
<h1>Operations#midori</h1>
<p>特定の曜日のリストを表示する</p>
<table class="table table-striped table-hover table-condensed">
<thead>
<tr>
<th>日付</th>
<th>手術件数</th>
<th>曜日を表示</th>
<th>最大件数</th>
<th>満員または空き</th>
<th>リンク</th>
</tr>
</thead>
<tbody>
<% @operation_weekdays.each do |e| %>
<tr>
<td><%= e.strftime("%Y/%m/%d(#{%w(日 月 火 水 木 金 土)[e.wday]})") %></td>
<td><% c = Operation.where(opedate: e).count %><%= c %>件</td>
<td><%= e.wday %></td>
<td>
<% case e.wday %>
<% when 2 %>
<% max = 22 %>
<% when 3 %>
<% max = 3 %>
<% when 5 %>
<% max = 22 %>
<% else %>
<% max = 0 %>
<% end %>
<%= max %>
</td>
<td>
<% if c < max then %>
<%= "空いています" %>
<% else %>
<%= "満員です" %>
<% end %>
</td>
<td>
<% f = e.strftime("%Y%m%d") %>
<%= link_to 'その日の手術リスト', operations_list_path(:year => f[0..3], :month => f[4..5], :day => f[6..7]) %>
</td>
</tr>
<% end %>
</tbody>
</table>
各日付のリンクを作成するのにも苦労した。
<% f = e.strftime(“%Y%m%d") %>
<%= link_to 'その日の手術リスト’, operations_list_path(:year => f[0..3], :month => f[4..5], :day => f[6..7]) %>
としたが、今のままだと、その日付の手術が1件もないと、エラーになってしまう。。。対策方法は、またあとで考える。
localhost:3000/operations/midori
(5)app/views/operations/listi.html.erb (一部)
<p id="notice"><%= notice %></p>
<% @operations.find(:first) do |operation| %>
<h1><%= operation.opedate.strftime("%Y/%m/%d(#{%w(日 月 火 水 木 金 土)[operation.opedate.wday]})") %>の手術予定</h1>
<% end %>
<table class="table table-striped table-hover table-condensed">
<thead>
<tr>
<th nowrap>入外</th>
<th>入院日</th>
<th>手術日</th>
<th width="5">定</th>
<th width="5">麻</th>
<th width="5">齢</th>
<th width="5">性</th>
<th>ID</th>
<th nowrap>患者氏名</th>
<th>眼</th>
<th nowrap>病名</th>
<th>術式</th>
<th nowrap>術者</th>
<th nowrap>助手</th>
<th nowrap>担当</th>
<th colspan="2"></th>
</tr>
</thead>
<tbody>
<% @operations.each do |operation| %>
<tr>
<td><%= operation.inout %></td>
<td>
<%#= operation.admissiondate %>
<% if operation.admissiondate.present? %>
<%= operation.admissiondate.strftime("%m/%d(#{%w(日 月 火 水 木 金 土)[operation.admissiondate.wday]})") %>
<%#= post.created_at.strftime("%Y/%m/%d(#{%w(日 月 火 水 木 金 土)[post.created_at.wday]})") %>
<% end %>
</td>
<td>
<%#= operation.opedate %>
<% if operation.opedate.present? %>
<%= operation.opedate.strftime("%Y/%m/%d(#{%w(日 月 火 水 木 金 土)[operation.opedate.wday]})") %>
<%#= post.created_at.strftime("%Y/%m/%d(#{%w(日 月 火 水 木 金 土)[post.created_at.wday]})") %>
<% end %>
</td>
<td><%= operation.special %></td>
<td><%= operation.anesthesia %></td>
<td>
<% begin %>
<%= (Date.today.strftime("%Y%m%d").to_i - operation.birthdate.strftime("%Y%m%d").to_i) / 10000 %>
<% rescue %>
<%= 200 %>
<% end %>
</td>
<td><%= operation.sex %></td>
<td><%= operation.patientID %></td>
<td><%= operation.patientname.truncate(6) %></td>
<td><%= operation.eye %></td>
<td nowrap><%= operation.disease1.truncate(8) %></td>
<td nowrap><%= operation.ope1.truncate(8) %></td>
<td><%= operation.operator %></td>
<td><%= operation.assist %></td>
<td><%= operation.inpatientdr %></td>
<td nowrap><%= link_to '編集', edit_operation_path(operation) %></td>
<td nowrap><%= link_to '削除', operation, method: :delete,
data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>
</table>
<br>
<%#= link_to 'New Operation', new_operation_path %>
<%= button_tag type: 'button', onclick: "link_to('#{new_operation_path}')",
class: "btn btn-primary" do %>
<%= content_tag :span, "新規登録", class: "glyphicon glyphicon-plus" %>
<% end %>
http://localhost:3000/operations/20160803 上記 midori のリンクから


ディスカッション
コメント一覧
まだ、コメントがありません