使用 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) %>">
关于这个主题已经有很多问题,但我似乎找不到任何有用的问题。使用 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) %>">