📘 hkob-astro-notion-blog

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

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

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

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

event_spec の記述(edit と update)

spec/requests/events/event_gakuseis_spec.rb を修正する. 今回は AJAX でのアクセスになるため,patch に xhr: true を追加した. Rails 4 までは xhr :patch, ... という形だったが Rails 5 から変わったらしい.

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)

app/controllers/events/event_gakuseis_controller.rb を記述する.

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 を作成

app/views/events/event_gakuseis/update.js.haml を記述する.

: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 の結果

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

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 "出席が更新できません."

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