2015-10-14 2 views
1

Я пытался исправить ошибку, связанную с использованием драгоценного камня Ancestry для комментариев к моему приложению для Rails 4. Я использовал railscast episode 262 в качестве руководства. Однако, в отличие от эпизода, моя модель модель является вложенным ресурсом внутри другой модели. Прежде чем идти дальше, я поставлю необходимый код для справки. Если вы хотите сразу же прочитать ошибку, это упоминается сразу после всех фрагментов кода.Ancestry Gem для вложенных комментариев с Rails, вызывающих неопределенную ошибку метода

соответствующие модели:

class Comment < ActiveRecord::Base 
    has_ancestry 
    belongs_to :user 
    belongs_to :scoreboard 
end 



class Scoreboard < ActiveRecord::Base 
    #scoreboard model is like an article page on which users can post comments 
    belongs_to :user 
    has_many :teams, dependent: :destroy 
    has_many :comments, dependent: :destroy 
    end 

Соответствующий код в файле маршрута:

resources :scoreboards do 
    resources :comments 
    resources :teams, only: [:edit, :create, :destroy, :update] 
end 

Метод Scoreboards Контроллер для страницы, на которой можно оставлять комментарии:

def show 
    @scoreboard = Scoreboard.find_by_id(params[:id]) 
    @team = @scoreboard.teams.build 
    @comment = @scoreboard.comments.new 
end 

Контроллер комментариев:

class CommentsController < ApplicationController 

    def new 
    @scoreboard = Scoreboard.find(params[:scoreboard_id]) 
    @comment = @scoreboard.comments.new(:parent_id => params[:parent_id]) 
    end 


    def create 
    @scoreboard = Scoreboard.find(params[:scoreboard_id]) 
    @comment = @scoreboard.comments.new comment_params 
    if @comment.save 
     redirect_to scoreboard_url(@comment.scoreboard_id) 
    else 
     render 'new' 
    end 
    end 

private 

    def comment_params 
     params.require(:comment).permit(:body, :parent_id).merge(user_id: current_user.id) 
    end 

end 

Я буду включать миграцию на родословной самоцвет, если какие-либо ошибки были сделаны на том, что:

class AddAncestryToComments < ActiveRecord::Migration 
    def change 
    add_column :comments, :ancestry, :string 
    add_index :comments, :ancestry 
    end 
end 

Следующий код показывает код вида:

Табло # показать Вид который дает меня ошибка в последней строке:

<div class= "comment-section"> 
    <%= form_for [@scoreboard, @comment] do |f| %> 
    <%= render 'shared/error_messages', object: f.object %> 
    <%= f.text_area :body, class: "comment-field" %> 
    <%= f.hidden_field :parent_id %> #is it needed to include this here? because this form is for new comments not replies 
    <%= f.submit "Join the discussion...", class: " comment-button btn btn-primary" %>  
    <% end %> 

<%= nested_comments @scoreboard.comments.reject(&:new_record?).arrange(:order => :created_at) %> 
</div> 

The (комментарии частичный) _comment.html.erb Вид:

<div class=" comment-div"> 
<p> Posted by <%= link_to "#{comment.user.name}", comment.user %> 
    <%= time_ago_in_words(comment.created_at) %> ago 
</p> 
<div class="comment-body"> 
    <%= comment.body %> 
    <%= link_to "Reply", new_scoreboard_comment_path(@scoreboard, comment, :parent_id => comment) %> 
</div> 
</div> 

Вспомогательный метод для визуализации комментариев:

def nested_comments(comments) 
    comments.map do |comment, sub_comment| #the comments.map also gives me an error if I choose to render the comments without the .arrange ancestry method 
    render(comment) + content_tag(:div, nested_comments(sub_comment), class: "nested_messages") 
    end.join.html_safe 
end 

new.html.erb для комментариев, которые один перенаправляются для ответов сформировать представление:

<%= form_for [@scoreboard, @comment] do |f| %> 
     <%= render 'shared/error_messages', object: f.object %> 
     <%= f.text_area :body, class: "comment-field" %> 
     <%= f.hidden_field :parent_id %> 
     <%= f.submit "Join the discussion...", class: " comment-button btn btn-primary" %>    
<% end %> 

после создания табло, я перенаправлен на страницу показа, где я получаю следующую ошибку:

undefined method `организовать 'for []: Array

Несмотря на то, что массив комментариев пуст, я получаю ту же ошибку, если она не была. Я пробовал .subtree.arrange, но это дает мне ту же ошибку. Кроме того, в документации по предкам говорилось, что .arrange работает только с классами. Я не знаю, что это значит. Я был бы признателен за некоторую помощь в том, чтобы заставить страницу работать, чтобы комментарии отображались правильно с ответами после их родительских комментариев. Если это неправильный подход для комментариев с резьбой (ответы и все), я был бы признателен за некоторое руководство по дальнейшему исследованию.

ответ

2

.reject(&:new_record?) это вернет массив. Ошибка звучит так: аранжировка - это область действия ActiveRecord. Поэтому переместите reject в конец, и он должен работать.

@scoreboard.comments.arrange(:order => :created_at).reject(&:new_record?) 
+0

Я пытался выяснить эту ошибку в течение 4-х дней. Вы решили это через 5 минут. Спасибо огромное! – kpaul

+0

Cheeky upvote from me –

1

В отношении свой комментарий вложенности, я реализовал это раньше, и нашел рекомендацию Railscasts в виде помощника быть крайне слабым.

Passing parent_id to a comment

Вместо этого, вы лучше, используя частичное, которая становится рекурсивной в зависимости от количества детей каждый comment имеет:

#app/views/scoreboards/show.html.erb 
<%= render @comments %> 

#app/views/scoreboards/_comment.html.erb 
<%= link_to comment.title, comment_path(comment) %> 
<div class="nested"> 
    <%= render comment.children if comment.has_children? %> 
</div> 
+0

Я действительно думал, как избавиться от помощника, и вот вы с ответом. Мне жаль, что я не смог принять два ответа. Кроме того, если вы не возражаете, можете ли вы объяснить, как работает следующая строка: <% = link_to comment.title, comment_path (комментарий)%> – kpaul

+0

Ой, извините, эта строка - просто демо для возможности использовать данные 'comment' в вашем частичном. Вы можете игнорировать это; в противном случае вы должны прочитать о том, как создавать коллекции здесь: http://guides.rubyonrails.org/layouts_and_rendering.html#rendering-collections –

+1

Круто спасибо! Мне также нравится эта идея nested_dropdown на другом посту. Действительно классный материал. Большое спасибо за Вашу помощь. – kpaul

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