我在我的Rails 4应用程序中实现了拖放功能。 我一直在跟随Ryan Bates的教程视频, #147 Sortable Lists (revised)
我可以拖动行,但更改不会保留在数据库中。
在我的视图(app / views / admin / sections / index.html.erb)中,我实现了这样的拖放功能:
<section class="dashboard">
<%= button_to "Sectie Toevoegen", new_admin_section_path, method: "get" %>
<table id="sections" class="table-borders">
<tbody data-update-url="<%= sort_admin_sections_url %>">
<% @sections.each do |section| %>
<%= content_tag_for :tr, section do %>
<td><%= link_to section.title, admin_section_path(section) %></td>
<td><%= link_to "Aanpassen", edit_admin_section_path(section) %> <%= link_to 'Verwijderen', admin_section_path(section), method: :delete, data: { confirm: "Ben je zeker?" } %> </td>
<% end %>
<% end %>
</tbody>
</table>
我不确定是否触发了排序操作(具有更新逻辑)。我的排序操作的代码如下所示:
app/controllers/admin/sections_controller.rb
def sort
params[:section].each_with_index do |id, index|
Section.where(id: id).update_all({position: index+1})
end
render nothing: true
end
我的路线定义如下:
namespace :admin do
...
resources :sections do
collection { post :sort }
end
end
调用jquery ui可排序方法中的更新回调(app / assets / javascripts / sections.js.coffee):
jQuery ->
$('#sections tbody').sortable
axis: 'y'
update: ->
$.post($(this).data('update_url'), $(this).sortable('serialize'))
,我用一个简单的alert()方法检查了这个。此外,当我通过Google Developer Tools控制台查看Javascript时,我发现没有Javascript错误。
我认为问题必须由Rails的质量分配安全性引起。当我拖动开发日志时,在拖动一行时,我看到了以下错误消息:
Started POST "/admin/sections" for 127.0.0.1 at 2014-11-13 20:45:04 +0100
Processing by Admin::SectionsController#create as */*
Parameters: {"section"=>["3", "4", "6", "2", "5"]}
Completed 500 Internal Server Error in 1ms
NoMethodError (undefined method `permit' for ["3", "4", "6", "2", "5"]:Array):
app/controllers/admin/sections_controller.rb:54:in `section_params'
app/controllers/admin/sections_controller.rb:15:in `create'
我试图通过添加&#39;:position =&gt;来解决这个问题。 []&#39;到我允许的参数列表:
def section_params
params.require(:section).permit(:title, :description, :image, :category_id)
end
但这并不能解决问题。
我的存储库位于: https://github.com/acandael/beautysalonapp2/tree/drag-and-drop
感谢您的帮助,
安东尼