1

Rails3とcoffeescriptでソートリストを実装しようとしています。以前にルーティングの問題があり、あなたの寛大な助けで解決できたので、今は別の問題があります。データパラメーターがサーバーに渡されません。

以下は私の見解です

#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"}、「本」と呼ばれるパラメータがないため、nilエラーが発生します。誰かが私を助けてくれますか、

どんな助けでも大歓迎です

前もって感謝します

4

1 に答える 1

2

ここでいくつか問題が発生しています。まず第一に、あなたの$.post議論は少し混乱しています:

$.post('/books/sort', $(this).data('#books'), $(this).sortable('serialize'))

$.post2番目の引数にデータが必要なので、これだけです:

$.post('/books/sort', $(this).sortable('serialize'))

より理にかなっています。

Sortable のserializeメソッドでは、 DOMid属性を特定の形式にする必要があります。

デフォルトでは、各アイテムの id を形式 で調べて動作し、 の"setname_number"ようなハッシュを吐き出し"setname[]=number&setname[]=number"ます。

Rails コントローラーでは、ブック ID の配列が必要なparams[:book]ため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)(.+)/)

物事を整理する方法は他にもいくつかあります。詳細については、ソート可能なドキュメントを参照してください。

于 2012-11-28T22:35:21.190 に答える