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

RailsApp Rails 2018年 12月 18日

event_spec の記述(new と create)

  1. spec/requests/kurasus/event_spec.rb を修正する.ほぼこれも以前と同じである.
  2. 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)

  1. app/controllers/kurasus/events_controller.rb を記述する.
  2. 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 を記述する.
  2. - content_for :title do
      - @title = "#{t '.title'}: #{@kurasu.name}"
    = render partial: 'form', locals: {event: @event, kurasu: @kurasu}
  3. app/views/kurasus/events/_form.html.haml を記述する(後日 12/21 に修正する).
  4. = 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 の結果

  1. guard の結果は以下のようになった
  2. 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 "イベントが登録できません."

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