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

时间:2015-02-03 01:40:46

标签: ruby-on-rails jquery-ui ruby-on-rails-4

关于这个主题已经有很多问题,但我似乎找不到任何有用的东西。使用this railscast,我尝试使用jquery-ui对问题列表进行排序,但是像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_pa​​th视图上(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。我已经添加了一个&#39;的位置&#39;列问题。我把它添加到路线:

routes.rb

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

在我看来,我有这个

文章/ 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'))

我的问题是,我不确定要传递给data-update-url的内容(以摆脱“没有路由匹配&#39;错误”)或者甚至是首先是正确的道路。

1 个答案:

答案 0 :(得分:1)

代码中的第一件事,更改行

@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方法以及它命中的控制器#操作。

关于嵌套资源的重要注意事项是,嵌套资源应用于&#34;成员&#34;父母的。因此,在您的情况下,您的两个资源块产生的是:

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

因此,在data属性中的erb标记中,您需要向其添加注释:

<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) %>">