events/event_gakuseis のコントローラは index と update のみとなる. このコントローラでは,AJAX での画面遷移を意識して,id を配置している.
$ bin/rails g controller events/event_gakuseis
Running via Spring preloader in process 30317
create app/controllers/events/event_gakuseis_controller.rb
invoke haml
create app/views/events/event_gakuseis
invoke rspec
invoke assets
invoke js
invoke css
$ bin/rails g integration_test event_gakusei
Running via Spring preloader in process 30351
invoke rspec
create spec/requests/event_gakuseis_spec.rb
mkdir -p spec/requests/events; mv spec/requests/event_gakuseis_spec.rb spec/requests/events
Rails.application.routes.draw do
(中略)
resources :events, only: [] do
resources :event_gakuseis, only: %i[index update], controller: 'events/event_gakuseis'
end
require 'rails_helper'
RSpec.describe :EventGakuseis, type: :request do
include Devise::Test::IntegrationHelpers
let(:object) { event_gakusei_factory :start_foo }
let!(:gakuseis) { gakusei_factories %i[foo2301 bar2302] }
let(:not_mine) { event_gakusei_factory :hr_baz3301 }
let!(:event) { event_factory :start2300_0406 }
let(:return_path) { event_event_gakuseis_path(edit_mode: true) }
context 'login by hkob' do
teacher_login :hkob
describe 'GET #index' do
context 'owned event' do
subject { -> { get event_event_gakuseis_path(event) } }
it_behaves_like :response_status_check, 200
it_behaves_like :response_body_includes, %w[始業 2301 foo]
end
context 'not owned event' do
subject { -> { get event_event_gakuseis_path(not_mine.event) } }
let(:return_path) { kurasus_path }
it_behaves_like :response_status_check, 302
it_behaves_like :response_body_not_includes, %w[始業 2301 foo]
it_behaves_like :flash_alert_message, 'イベントを表示する権限がありません.'
end
end
if false
(中略)
end
end
context 'not login' do
describe 'GET #index' do
subject { -> { get event_event_gakuseis_path(event) } }
it_behaves_like :response_status_check, 302
it_behaves_like :response_body_not_includes, %w[始業 2301 foo]
end
end
end
class Events::EventGakuseisController < ApplicationController
before_action :authenticate_teacher!
before_action :get_event
def index
redirect_to(kurasus_path, alert: t('.not_my_event')) and return if @event.nil?
@kesseki_mode = true if params[:kesseki_mode]
@event_gakuseis = @event.event_gakuseis.order_number
if @event_gakuseis.count == 0
@event_gakuseis = []
@kurasu = @event.kurasu
@kurasu.gakuseis.order_number.each do |g|
@event_gakuseis << @event.event_gakuseis.create(gakusei_id: g.id, shusseki: EventGakusei.shussekis[:unsettled]) if g.event_gakuseis.event_is(@event).count == 0
end
end
end
def get_event
@event = Event.find_by_id(params[:event_id])
@event = nil if @event && @event.kurasu.teacher != current_teacher
end
private :get_event
end
scope :event_is, -> e { where arel_table[:event_id].eq e.id }
- content_for :title do
- @title = "#{t '.title'}: #{@event.name}, #{@event.kurasu.name}"
.row
- EventGakusei.shussekis.each do |key_array|
- key = key_array.first
.column{class: key}
- key_title = t_ar EventGakusei, "shusseki.#{key}"
- mode = key_array.last
- case mode
- when 0
.button.button-outline= key_title
- when 1
- if @kesseki_mode
= link_to key_title, event_event_gakuseis_path(@event), class: 'button button-outline'
- else
.button= key_title
- when 2
- if @kesseki_mode
.button= key_title
- else
= link_to key_title, event_event_gakuseis_path(@event, kesseki_mode: true), class: 'button button-outline'
%br
- @event_gakuseis.each do |eg|
- g = eg.gakusei
%div{id: "#{g.id}_#{mode}"}
= render partial: 'index_sub.html', locals: {event_gakusei: eg, kesseki_mode: @kesseki_mode, mode: mode}
- event = event_gakusei.event
- gakusei = event_gakusei.gakusei
- if event_gakusei.shusseki_before_type_cast == mode
= link_to gakusei.number_name, event_event_gakusei_path(event, event_gakusei, event_gakusei: {shusseki: mode == 0 ? kesseki_mode ? :kesseki : :shusseki : :unsettled}, kesseki_mode: kesseki_mode), class: :button, method: :put, remote: true
# @return [String] 学生番号と氏名を返す
def number_name
"#{number} #{name}"
end
ja:
activerecord:
models:
event_gakusei: イベント学生
(中略)
attributes:
event_gakusei:
shusseki: 出席
event_gakusei/shusseki:
unsettled: 未設定
shusseki: 出席
kesseki: 欠席
ja:
events:
event_gakuseis:
index:
title: 出席簿
not_my_event: イベントを表示する権限がありません.
EventGakuseis
login by hkob
GET #index
owned event
behaves like response_status_check
response should be 200
behaves like response_body_includes
response body includes ["始業", "2301", "foo"]
not owned event
behaves like response_status_check
response should be 302
behaves like response_body_not_includes
response body does not include ["始業", "2301", "foo"]
behaves like flash_alert_message
should eq "イベントを表示する権限がありません."
not login
GET #index
behaves like response_status_check
response should be 302
behaves like response_body_not_includes
response body does not include ["始業", "2301", "foo"]
長くなったので今日はここまで