我正在尝试使用Rails3和coffeescript实现排序列表。我之前遇到过路由问题并且能够使用your generous help解决它,所以现在我有一个不同的问题,我的数据参数没有传递给服务器,
以下是我的观点
#index.html.erb
<h1>Listing books</h1>
<ul id="books"> <% @books.each do |book| %>
<li class="book<%= book.id %>"><span class="handle">[drag]</span><%= book.name %></li>
<% end %></ul>
<%= link_to 'New book', new_book_path %>
以下是我的books.js.coffee文件
jQuery ->
$('#books').sortable
axis: 'y'
handle: '.handle'
update: ->
$.post('/books/sort', $(this).data('#books'), $(this).sortable('serialize'))
以下是我的控制器
#books_controller.rb
def sort
@books = Book.all
@books.each do |book|
book.position = params['book'].index(book.id.to_s) + 1
book.save
end
render :nothing => true
end
这是我得到的错误
Served asset /jquery.js - 304 Not Modified (0ms)
Started POST "/books/sort" for 127.0.0.1 at 2012-11-28 17:03:25 +0530
Processing by BooksController#sort as */*
Book Load (0.2ms) SELECT "books".* FROM "books"
Completed 500 Internal Server Error in 2ms
NoMethodError (undefined method `index' for nil:NilClass):
app/controllers/books_controller.rb:14:in `block in sort'
app/controllers/books_controller.rb:13:in `each'
app/controllers/books_controller.rb:13:in `sort'
Rendered /home/sameera/.rvm/gems/ruby-1.9.2-p290/gems/actionpack-3.2.9/lib/action_dispatch/middleware/templates/rescues/_trace.erb (40.8ms)
Rendered /home/sameera/.rvm/gems/ruby-1.9.2-p290/gems/actionpack-3.2.9/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.0ms)
Rendered /home/sameera/.rvm/gems/ruby-1.9.2-p290/gems/actionpack-3.2.9/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (47.7ms)
所以,当我说p params
时,我得到{"action"=>"sort", "controller"=>"books"}
,所以它没有一个名为'book'的参数,因此给出了一个零错误,有人可以帮助我,
任何帮助将不胜感激
提前致谢
答案 0 :(得分:2)
这里有一些问题。首先,您的$.post
参数有点混淆:
$.post('/books/sort', $(this).data('#books'), $(this).sortable('serialize'))
$.post
想要第二个参数中的数据就这样:
$.post('/books/sort', $(this).sortable('serialize'))
更有意义。
Sortable的serialize
method希望DOM id
属性采用特定形式:
默认情况下,它通过查看
"setname_number"
格式的每个项目的ID来运行,并且会发出类似"setname[]=number&setname[]=number"
的哈希值。
在您的Rails控制器中,您需要params[:book]
中的一系列图书ID,因此您希望book[]=id&book[]=id&...
转到您的服务器。这意味着您希望<li>
看起来更像这样:
<li id="book_<%= book.id %>">
或者您可以通过包含下划线来保持使用class
属性:
<li class="book_<%= book.id %>">
然后告诉serialize
查看class
:
$(this).sortable('serialize', attribute: 'class')
您还应该使用expression
选项并保留HTML:
$(this).sortable('serialize', attribute: class, expression: /(book)(.+)/)
还有其他一些方法可以安排,有关详细信息,请参阅sortable documentation。