【发布时间】:2020-11-28 10:58:21
【问题描述】:
我正在尝试使用nested_attributes 实现“拖放排序列表”(https://gorails.com/episodes/rails-drag-and-drop-sortable)。
很遗憾,我弄错了:position。即使总共应该只有三个位置,它也会从 2 跳到 5 到 7。
我认为问题在于隐藏的输入标签也被计算在内。如果这是主要问题,有什么办法可以解决这个问题?
// config/routes.rb
resources :recipes, except: :index do
resources :steps do
resource :step_position, only: :update
end
end
// app/views/recipes/_form.html.erb
<div data-controller="sortable" data-sortable-url="/recipes/:recipe_id/steps/:id/step_position">
<%= f.fields_for :steps, @recipe.steps.order(position: :asc) do |step| %>
<div data-id="<%= step.object.id %>">
<%= step.text_area :description %>
</div>
<% end %>
</div>
// app/javascript/controllers/sortable_controller.js
import { Controller } from "stimulus";
import Rails from "@rails/ujs";
import { Sortable } from "sortablejs";
export default class extends Controller {
connect() {
this.sortable = Sortable.create(this.element, {
onEnd: this.end.bind(this),
});
}
end(event) {
let id = event.item.dataset.id;
let data = new FormData();
data.append("position", event.newIndex + 1);
Rails.ajax({
url: this.data.get("url").replace(":id", id),
type: "PATCH",
data: data,
});
}
}
// app/controllers/step_positions_controller.rb
class StepPositionsController < ApplicationController
def update
@step = Step.find(params[:step_id])
authorize @step.recipe
@step.insert_at(params[:position].to_i)
head :ok
end
end
【问题讨论】:
-
你有没有得到这个工作?我被困在同一个地方,我的排序顺序也在做同样的事情。当我总共只有 3 个时,跳到 7 个。如果是这样,你最终做了什么?
-
@spacerobot,是的,我做到了!刚刚发布了答案。
标签: ruby-on-rails nested-attributes sortablejs acts-as-list stimulusjs