📘 hkob-astro-notion-blog

これまではてなブログにて情報発信をしていましたが、令和5年3月22日より、こちらでの情報発信を始めました。2019年以前の古い記事は過去の Middleman 時代のものなので、情報が古いです。記録のためだけに残しています。

events コントローラの作成(2) - 不定期刊 Rails App を作る(31)

💡
この記事は Middleman 時代に書いた古いものです。記録のため、astro-notion-blog に移行していますが、あまり参考にしないでください。
event_spec の記述(new と create)

spec/requests/kurasus/event_spec.rb を修正する.ほぼこれも以前と同じである.

describe 'GET #new' do
  context 'my kurasu' do
    subject { -> { get new_kurasu_event_path(kurasu) } }
    it_behaves_like :response_status_check, 200
  end

  context 'not my kurasu' do
    subject { -> { get new_kurasu_event_path(not_mine.kurasu) } }
    it_behaves_like :response_status_check, 302
  end
end

describe 'POST #create' do
  before { @attrs = object.attributes; object.destroy }
  subject { -> { post kurasu_events_path(kurasu), params: {event: @attrs}} }

  context '正しいパラメータに対して' do
    it_behaves_like :response_status_check, 302
    it_behaves_like :increment_object_by_create, Event
    it_behaves_like :redirect_to
    it_behaves_like :flash_notice_message, 'イベントを登録しました.'
  end

  context '不正なパラメータに対して' do
    before { @attrs['name'] = nil }
    it_behaves_like :response_status_check, 200
    it_behaves_like :not_increment_object_by_create, Event
    it_behaves_like :flash_alert_message, 'イベントが登録できません.'
  end
end

event_controller の記述(new と create)

app/controllers/kurasus/events_controller.rb を記述する.

def new
  @kurasus = current_teacher.kurasus.order_name
  redirect_to kurasus_path and return if @kurasu.nil?
  max_so = @kurasu.events.date_value_is(Date.today).maximum(:sort_order)
  @event = @kurasu.events.build(name: 'イベント名', date: Date.today, sort_order: max_so ? max_so + 1 : 1)
end

def create
  @event = Event.new(event_params)
  if @event.save
    redirect_to kurasu_events_path(@kurasu, edit_mode: true), notice: notice_message(Event)
  else
    flash.now[:alert] = alert_message(Event)
    render action: :new
  end
end

(中略)

def event_params
  params.require(:event).permit(:kurasu_id, :name, :date, :sort_order)
end
private :event_params

new の view を作成
  1. app/views/kurasus/events/new.html.haml を記述する.
    - content_for :title do
      - @title = "#{t '.title'}: #{@kurasu.name}"
    = render partial: 'form', locals: {event: @event, kurasu: @kurasu}
  2. app/views/kurasus/events/_form.html.haml を記述する(後日 12/21 に修正する).
    = form_with model: [@kurasu, event], local: true do |f|
      %table
        %tr
          %th= f.label :name
          %td= f.text_field :name, autofocus: true
        %tr
          %th= f.label :date
          %td= f.text_field :date
        %tr
          %th= f.label :sort_order
          %td= f.text_field :sort_order
        %tr
          %td{colspan: 2}
            = f.submit
guard の結果

guard の結果は以下のようになった

GET #new
  my kurasu
    behaves like response_status_check
      response should be 200
  not my kurasu
    behaves like response_status_check
      response should be 302
POST #create
  正しいパラメータに対して
    behaves like response_status_check
      response should be 302
    behaves like increment_object_by_create
      should change `Event.count` by 1
    behaves like redirect_to
      should redirect to "/kurasus/1902/events?edit_mode=true"
    behaves like flash_notice_message
      should eq "イベントを登録しました."
  不正なパラメータに対して
    behaves like response_status_check
      response should be 200
    behaves like not_increment_object_by_create
      should not change `Event.count`
    behaves like flash_alert_message
      should eq "イベントが登録できません."

長くなったので今日はここまで