bootcamp icon indicating copy to clipboard operation
bootcamp copied to clipboard

プラクティスの並び替えができない。

Open Saki-htr opened this issue 2 years ago • 2 comments

概要

管理者でログイン時、プラクティス一覧ページで、プラクティスの並び替えができなくなっている。

再現手順

  1. 管理者でログイン
  2. プラクティス一覧(courses/:id/practices)にアクセス
  3. 「順番変更」をクリック
  4. 任意のプラクティスを並び替える
  5. 「変更完了」をクリック
  6. 順番が変わっていない

スクリーンショット

Image from Gyazo

期待される振る舞い

プラクティスの並び替えをできるようにしたい。

Saki-htr avatar May 02 '22 08:05 Saki-htr

このissue|PRは60日間更新がないため7日後にcloseします。closeしたくない場合はstaleラベルを外してください。

github-actions[bot] avatar Jul 02 '22 01:07 github-actions[bot]

このissue|PRは60日間更新がないため7日後にcloseします。closeしたくない場合はstaleラベルを外してください。

github-actions[bot] avatar Sep 02 '22 01:09 github-actions[bot]

このissue|PRは60日間更新がないため7日後にcloseします。closeしたくない場合はstaleラベルを外してください。

github-actions[bot] avatar Nov 05 '22 01:11 github-actions[bot]

@komagata お疲れ様です! こちら、私の環境で再現するのか試したのですが、ローカルおよびステージング環境でプラクティスの並び順を変更できました。 Image from Gyazo 本番環境では発生していますでしょうか?

fuwa-syugyo avatar Dec 19 '22 14:12 fuwa-syugyo

@fuwa-syugyo ちょっとデータを増やしたりして複雑な並び替えをして、その通りに並んでいるか調べてみてください。 その上で問題なければCloseしたいと思います〜。

(本番ですと全生徒に影響してしまいそうなので簡単に試すことができない状態です。)

komagata avatar Dec 20 '22 16:12 komagata

@komagata データを増やしたりプラクティスのステータスを変えたりして試してみましたが、やはり再現しませんでした。

Image from Gyazo

今年の3/21に並び替えで使用しているjsのライブラリのSortablejs( https://github.com/SortableJS/Sortable )のバージョンが上がったので、もしかしたらそれで修正されたのかもしれません。

fuwa-syugyo avatar Dec 21 '22 00:12 fuwa-syugyo

@fuwa-syugyo かしこまりました。ではこちらのIssueは完了でOKです〜。

komagata avatar Dec 21 '22 05:12 komagata

調査続行のためReopenします〜

fuwa-syugyo avatar Dec 21 '22 07:12 fuwa-syugyo

@komagata お疲れ様です。 プラクティスの並び替えについて、現時点で考えていることを共有させていただきます。 質問もありますが確認をお願いできますでしょうか。

position.jsonが表示されない件について

並べ替えの操作を行うと画像のようにNetworkタブにposition.jsonが表示されます。 が、アクセスしようとするとルーティングエラーとなってしまいます。 image

image

api/categories_practicesにはupdateしか用意されておらず、getがないため表示できないのかな?と考えています。

config/routes/api.rb

    resources :categories_practices, only: %i() do
      resource :position, only: %i(update), controller: "categories_practices/position"
    end

以前はpracticeのpositionでプラクティスの並び順を制御していたようですが、こちらのissue( https://github.com/fjordllc/bootcamp/pull/5508 )でcategories_practicesのpositionを使うようになったようです。

プラクティスの順番を変える処理の流れについて

プラクティスの並び順を変える処理を調べていますが、わからない箇所があるのでヒント等いただきたいです。 処理の流れは以下のように考えています。

  1. app/javascript/categories-practice.jsparamsinsert_atプロパティに挿入した場所が入る
  2. patchでurl(/api/categories_practices/${id}/position.json)をfetchして、paramsをPATCHする
  3. app/controllers/api/categories_practices/position_controller.rbupdateメソッドで、動かしたプラクティスのCategoriesPracticesを見つける
  4. insert_at@categories_practicespositionに代入する
  5. CategoriesPracticespositionの順番でプラクティスが並ぶ

4でinsert_atがなぜCategoriesPracticespositionに代入されるのかがわかりません。 あと、app/javascript/categories-practice.jsに記載がある/api/categories_practices/${id}/position.jsonを示すjbuilderのファイルも見つかっていません。

その他

以前は並び替え処理をvueで実装していたようで、駒形さんがsortablejsを使ったものに変更されていました。 https://github.com/fjordllc/bootcamp/pull/4890/files このissueに関わる箇所をかなり変更されていると思いますが、何か心当たり等ありますか…? また、現時点でもやはりプラクティスの並び替えができないという現象は発生しておりませんが、もう少し調査を続ける必要はありますでしょうか?

質問が多く申し訳ございません。お手数ですがご確認をお願いいたします🙏

fuwa-syugyo avatar Dec 25 '22 13:12 fuwa-syugyo

@fuwa-syugyo

4でinsert_atがなぜCategoriesPracticesのpositionに代入されるのかがわかりません。

何が疑問点なのかちょっと僕にとってわかりませんでした。 これはどういった意味でしょうか、もう少し説明いただければありがたいです〜。

komagata avatar Dec 27 '22 21:12 komagata

@komagata 説明不足で申し訳ございません。。 app/controllers/api/categories_practices/position_controller.rbBootcamp.patch(url, params)で並び順変更後の位置(params)が送信されていると思うのですが、それがなぜCategoriesPracticepositionカラムに代入されるのかがわからないということです。

app/controllers/api/categories_practices/position_controller.rb

import Sortable from 'sortablejs'
import Bootcamp from 'bootcamp'

document.addEventListener('DOMContentLoaded', () => {
  const elements = document.querySelectorAll('.js-admin-category-practice')
  if (!elements) {
    return null
  }

  elements.forEach((element) => {
    Sortable.create(element, {
      handle: '.js-grab',
      onEnd(event) {
        const id = event.item.dataset.categories_practice_id
        const params = { insert_at: event.newIndex + 1 }
        const url = `/api/categories_practices/${id}/position.json`

        Bootcamp.patch(url, params).catch((error) => {
          console.warn(error)
        })
        console.log(Bootcamp)
      }
    })
  })
})

byebugでデバッグしたところ、app/controllers/api/categories_practices/position_controller.rbif @categories_practice.insert_at(params[:insert_at])の前後で@categories_practice.positionが変更されていたのですが、このif文でpositionが変わる流れがわかりません。 insert_atposition がどうやって結びついているのかが理解できていないです。 (おそらく /api/categories_practices/${id}/position.jsonが何かしているのだと思いますが、jbuilderのファイルにそれらしき記述がないですし、アクセスしようとしてもルーティングエラーになってしまうので理解できていません。)

app/controllers/api/categories_practices/position_controller.rb

class API::CategoriesPractices::PositionController < API::BaseController
  def update
    @categories_practice = CategoriesPractice.find(params[:categories_practice_id])
    byebug
    if @categories_practice.insert_at(params[:insert_at])
      head :no_content
    else
      render json: @categories_practice.errors, status: :unprocessable_entity
    end
  end
end

fuwa-syugyo avatar Dec 28 '22 08:12 fuwa-syugyo

@fuwa-syugyo insert_atの実装を見てみるのはいかがでしょうか? 下記が参考になるかもしれません。

Rubyでメソッドの定義場所を見つける方法 - Qiita

komagata avatar Dec 29 '22 22:12 komagata

@komagata insert_atact_as_listというgemのメソッドでした。 https://github.com/brendon/acts_as_list/tree/ddbba24b9bff6993602859dcb8ec9f382bdbb8e9

        # Insert the item at the given position (defaults to the top position of 1).
        def insert_at(position = acts_as_list_top)
          insert_at_position(position)
        end

これでpositionカラムにinsert_atの引数が入っているのかなと思います。

position.jsonについてですがこちらのPR( https://github.com/fjordllc/bootcamp/pull/2264 )によると以下のようです。

JSON形式のパラメータは、送信先のコントローラ名に対応するモデル名でラップされる設定になっていますが、PositionControllerには対応するモデル(Positionモデル)がないため、ラップするキーをwrap_parametersで指定しています

/api/categories_practices/${id}/position.jsonCategoriesPracticepositionカラムに対応していて、GETは指定されていないので表示はできないということになるのかな?と思います。

fuwa-syugyo avatar Dec 31 '22 09:12 fuwa-syugyo

@fuwa-syugyo 了解です。必要であれば修正をお願いします。

komagata avatar Jan 05 '23 03:01 komagata

@komagata 私としては並び替えができているのでこのままで問題ないのかな?と思います。 position.jsonがルーティングエラーになるのが気になっていましたが、getが定義されていないため仕様通りなのかなと。 強いていうならデフォルトスコープが使用されているのが気になりましたが実装者が意図して使っているようなのでそのままで良いかと思います。

fuwa-syugyo avatar Jan 05 '23 13:01 fuwa-syugyo

@fuwa-syugyo エラーになっているのは問題だと思います。(不要であれば削除する必要があると思います。) 個別の仕様だけでなく、サイト全体としてどのようにするのがいいのかの視点で考えてみてください〜。

komagata avatar Jan 10 '23 06:01 komagata

@komagata お疲れ様です! ミーティングで共有させていただきましたが、position.jsonのエラーは特に問題ないということでした。 クローズさせていただければと思います。

fuwa-syugyo avatar Jan 11 '23 07:01 fuwa-syugyo

@komagata closeいたしました〜!

fuwa-syugyo avatar Jan 17 '23 01:01 fuwa-syugyo