【问题标题】:parameters are not passing to the controller Rails3 + coffeescript + ajax参数未传递给控制器​​ Rails3 + coffeescript + ajax
【发布时间】:2012-11-16 06:06:31
【问题描述】:

我正在尝试使用 Rails3 和咖啡脚本实现排序列表。我之前遇到了路由问题,可以用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"=&gt;"sort", "controller"=&gt;"books"},所以它没有一个名为“book”的参数,因此给出了一个 nil 错误,有人可以帮助我吗,

任何帮助将不胜感激

提前致谢

【问题讨论】:

  • 我会看看jQuery.post() 文档。您不能像在 CoffeeScript 中那样将多个值传递给 $.post,并期望它们能够到达服务器。
  • 您期望$(this).data('#books') 是什么?我没有看到任何设置该数据属性的东西,#books 看起来更像是 ID 选择器而不是数据属性名称。
  • 嗨@JonathanTran,感谢您的回答,我将代码更改为 $.post('/books/sort', {book: 'sample data'}, $(this).sortable(' serialize')) 并设法将字符串示例数据传递给控制器​​,但是我怎么能将整个
      传递给控制器​​进行排序!!!谢谢
  • 嗨@muistooshort,你能告诉我如何设置数据属性,我在这里要做的是通过命令 $(this).data( '#books'),这样做的正确方法是什么,非常感谢您的回答:)
  • $(this).data('#books') 中应该包含什么?我不明白当$(this).sortable('serialize') 应该拥有你需要的一切时,你为什么需要它。

标签: ruby-on-rails-3 jquery controller coffeescript


【解决方案1】:

这里有一些问题。首先,您的$.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&amp;setname[]=number" 这样的哈希。

在您的 Rails 控制器中,您需要 params[:book] 中的书籍 ID 数组,因此您希望 book[]=id&amp;book[]=id&amp;... 进入您的服务器。这意味着您希望您的&lt;li&gt;s 看起来更像这样:

<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 了解更多详情。

【讨论】:

  • 嗨@muistooshort,非常感谢您的回答,我得到了它的工作;)
猜你喜欢
  • 1970-01-01
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 2015-09-08
  • 1970-01-01
  • 2012-12-04
相关资源
最近更新 更多