2015-02-03 2 views
0

Есть много вопросов по этой теме, но я не могу найти ничего, что сработает. С помощью this railscast, я пытаюсь сортировать список вопросов с помощью jquery-ui, но, как this вопрос, мои вложенные ресурсы путают вещи.Сортировка вопросов с помощью вложенных ресурсов с помощью jquery

У меня есть три модели: сообщения, комментарии и вопросы.

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_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 правильно. Я добавил столбец «позиция» к вопросам. Я добавил это к маршрутам:

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> 

Наконец, сообщения. js.coffee:

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

. Моя проблема заключается в том, что я не уверен, что нужно передать в URL-адрес data-update-url (чтобы избавиться от ошибки «нет соответствия маршрута»), или если это даже правильный путь в первую очередь.

ответ

1

Первое в своем коде, измените строку

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

в

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

Как вы обычно хотите только один, где() вызова, если вы можете помочь ему. Иногда вам нужно добавить один условно, что хорошо. Например, в блоке if.

Что касается ошибки вашего маршрута, запустите rake routes в терминале, и вы увидите вывод всех методов маршрута, параметров, которые они принимают, метода HTTP и действия контроллера #.

Важно отметить, что вложенный ресурс применяется к «члену» родительского элемента.Так что в вашем случае, что два ваших ресурсов блоки генерации являются:

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

Так что в ваших Еврорадио теги атрибута данных, необходимо добавить комментарий к ней:

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

Проблема, однако, является что вы используете это на уровне модели публикации, в котором много комментариев. Так что вы, вероятно, хотите, это:

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

Великий, что в основном зафиксировал его. (Просто нужно было изменить sort_post_questions_path для sort_post_path). Молодой канадский парень ценит помощь :) – user2759575

+0

Ах ладно. Как и должно было заставить работать, как я. Но это определенно не требуется :) – agmcleod

Смежные вопросы