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

RailsApp Rails 2018年 12月 26日

ここもほぼ同内容である.

event_spec の記述(edit と update)

  1. spec/requests/events/event_gakuseis_spec.rb を修正する. 今回は AJAX でのアクセスになるため,patch に xhr: true を追加した. Rails 4 までは xhr :patch, ... という形だったが Rails 5 から変わったらしい.
  2. describe 'PATCH #update' do
      before { @attrs = object.attributes }
    
      context 'owned object' do
        subject { -> { patch event_event_gakusei_path(event, object), params: {event_gakusei: @attrs}, xhr: true } }
    
        context '正しいパラメータに対して' do
          before { @attrs['shusseki'] = 'kesseki' }
          it_behaves_like :response_status_check, 200
          it_behaves_like :change_object_value_by_update, EventGakusei, :shusseki, 'kesseki'
        end
      end
    
      context 'not owned object' do
        subject { -> { patch event_event_gakusei_path(event, not_mine), params: {event_gakusei: @attrs}, xhr: true } }
        it_behaves_like :response_status_check, 302
        it_behaves_like :redirect_to
        it_behaves_like :flash_alert_message, '出席が更新できません.'
      end
    end

event_controller の記述(edit と update)

  1. app/controllers/events/event_gakuseis_controller.rb を記述する.
  2. def update
      @kesseki_mode = true if params[:kesseki_mode]
      @event_gakusei = @event.event_gakuseis.find_by_id(params[:id])
      redirect_to(kurasus_path, alert: t('.not_my_event')) and return if @event.nil?
      redirect_to(event_event_gakuseis_path(@event), alert: alert_message(EventGakusei)) and return if @event_gakusei.nil?
      @pre_value = @event_gakusei.shusseki_before_type_cast
      @event_gakusei.update_attributes(event_gakusei_params)
    end
    
    (中略)
    def event_gakusei_params
      params.required(:event_gakusei).permit(:shusseki)
    end

update の javascript を作成

  1. app/views/events/event_gakuseis/update.js.haml を記述する.
  2. :plain
      var pre = document.getElementById('#{@event_gakusei.gakusei_id}_#{@pre_value}')
      pre.innerHTML = ''
      var post = document.getElementById('#{@event_gakusei.gakusei_id}_#{@event_gakusei.shusseki_before_type_cast}')
      post.innerHTML = '#{escape_javascript(render partial: 'index_sub.html', locals: {event_gakusei: @event_gakusei, kesseki_mode: @kesseki_mode, mode: @event_gakusei.shusseki_before_type_cast})}'

guard の結果

  1. guard の結果は以下のようになった
  2. PATCH #update
      owned object
        正しいパラメータに対して
          behaves like response_status_check
            response should be 200
          behaves like change_object_value_by_update
            should change `klass.find(object.id).send(key)` from "shusseki" to "kesseki"
      not owned object
        behaves like response_status_check
          response should be 302
        behaves like redirect_to
          should redirect to "/events/2026/event_gakuseis"
        behaves like flash_alert_message
          should eq "出席が更新できません."

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