关于这个主题已经有很多问题,但我似乎找不到任何有用的东西。使用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_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。我已经添加了一个&#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;错误”)或者甚至是首先是正确的道路。
答案 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) %>">