使用 jquery 对嵌套资源的问题进行排序

Sorting questions with nested resources using jquery

关于这个主题已经有很多问题,但我似乎找不到任何有用的问题。使用 this railscast, I'm trying to sort a list of questions using jquery-ui but like this 问题我的嵌套资源令人困惑。

我有三个模型:帖子、评论和问题。

Post.rb:

class Post < ActiveRecord::Base
  has_many :comments
  has_many :questions, :through :comments
end

Comment.rb

class Comment < ActiveRecord::Base
  belongs_to :post
  has_many :questions
end

Question.rb

class Question < ActiveRecord::Base
  belongs_to :comment
end    

我要排序的问题列表在 ordered_path 视图中 (posts/:id/ordered)。这是帖子控制器:

Posts_controller.rb

def ordered 
 @post = Post.friendly.find(params[:id])
 @ordered = @post.questions.where(:hide => true).where(:recommend => true).order("position")
end

和questions_controller.rb:

def sort
  params[:question].each_with_index do |id, index|
  Question.update_all({position: index+1}, {id: id})
end
  render nothing: true
end

我相信我已经正确地遵循了 railscast。我在问题中添加了 'position' 列。我将其添加到路线中:

routes.rb

resources :comments do
 resources :questions do
  collection { post :sort }
 end
end    

在我看来我有这个

posts/ordered.html.erb

<ul id="questions" data-update-url="<%= sort_comment_questions_path %>">
 <% @ordered.each do |question| %>
   <%= content_tag_for :li, question do %>
    <span class="handle">[drag]</span>
     <%= question.body %>
   <% end %>
 <% end %>
</ul>

最后,posts.js.coffee:

jQuery ->
  $('#questions').sortable
    axis: 'y'
    handle: '.handle'
    update: ->
      $.post($(this).data('update-url'), $(this).sortable('serialize'))

我的问题是我不确定将什么传递到数据更新-url(以消除 'no route matches' 错误)或者这是否是正确的路径第一名。

首先在您的代码中更改行

@ordered = @post.questions.where(:hide => true).where(:recommend => true).order("position")

@ordered = @post.questions.where(:hide => true, :recommend => true).order("position")

因为您通常只需要一个 where() 调用(如果可以的话)。有时您需要有条件地添加一个,这很好。例如在 if 块中。

至于你的路由错误,运行 rake routes 在终端,你会看到所有路由方法的输出,它们接受的参数,HTTP 方法,以及什么控制器#action它命中了。

关于嵌套资源需要注意的重要一点是,嵌套资源应用于父级的 "member"。因此,在您的情况下,您的两个资源块生成的是:

GET /comments/:comment_id/questions questions#index
GET /comments/:comment_id/questions/:id questions#show
POST /comments/:comment_id/questions/sort questions#sort

所以在你的erb标签的data属性中,你需要给它加上注释:

<ul id="questions" data-update-url="<%= sort_comment_questions_path(@comment) %>">

但问题是您在 post 模型级别使用它,其中有很多评论。所以你可能想要的是:

resources :comments do
  resources :questions
end

resources :posts do
  member do
    post "sort" => "questions#sort", :as => "sort_questions"
  end
end

那么在你看来:

<ul id="questions" data-update-url="<%= sort_questions_post_path(@post) %>">