2015-10-26 3 views
2

Я создаю вложенные комментарии (как вы находите в Reddit). Я могу создать родительские комментарии, но когда я пытаюсь создать дочерний комментарий, он просто отображается как родительский комментарий.Невозможно назначить родительский идентификатор вложенным комментариям, используя Ancestry gem (ruby on rails)

В моей консоли рельсов поле «родословная» возвращается «ноль».

Это мой комментарий контроллер:

class CommentsController < ApplicationController 
    before_action :set_comment, only: [:show, :edit, :update, :destroy] 
    before_filter :authenticate_user! 

    def show 
    @comment = Comment.find(params[:id]) 
    end 

    def new 
    @link = Link.find(params[:link_id]) 
    @comment = Comment.new(:parent_id => params[:parent_id]) 
    @comments = Comment.all 
    end 

    def create 
    @link = Link.find(params[:link_id]) 

    @parent = Link.find(params[:link_id]) if params[:link_id] 
    @parent = Comment.find(params[:comment_id]) if params[:comment_id] 

    @comment = @parent.comments.new(comment_params) 
    @comment.user = current_user 

    respond_to do |format| 
     if @comment.save 
     format.html { redirect_to @link, notice: 'Comment was successfully created.' } 
     format.json { render json: @comment, status: :created, location: @comment } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @comment.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def destroy 
    @comment.destroy 
    respond_to do |format| 
     format.html { redirect_to :back, notice: 'Comment was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 

    def set_comment 
     @comment = Comment.find(params[:id]) 
    end 


    def comment_params 
     params.require(:comment).permit(:link_id, :body, :user_id) 
    end 
end 

Вот мой _comment_form частичного

<%= div_for(comment) do %> 
    <div class="comments_wrapper clearfix"> 
     <div class="pull-left"> 
      <p class="lead"><%= comment.body %></p> 
      <p><small>Submitted <strong><%= time_ago_in_words(comment.created_at) %> ago</strong> by <%= comment.user.email %></small></p> 
        <div id="reply" style="display:none;"> 
       <%= form_for [@comment = Comment.new(:parent_id => params[:parent_id])] do |f| %> 
       <%= f.hidden_field :parent_id %> 
        <%= f.text_area :body %> <br> 
        <%= f.submit %> 
        <% end %> 
       </div> 
     </div> 

     <div class="actions btn-group pull-right"> 
      <button onClick="$('#reply').show()" class="btn btn-sm btn-default">Reply</button> 

      <% if comment.user == current_user -%> 
       <%= link_to 'Destroy', comment, method: :delete, data: { confirm: 'Are you sure?' }, class: "btn btn-sm btn-default" %> 
      <% end %> 
     </div> 
    </div> 

<% end %> 

Это мои маршруты

Rails.application.routes.draw do 
    resources :comments 
    devise_for :users 
    devise_for :installs 
    resources :links do 
    member do 
     put "like", to: "links#upvote" 
     put "dislike", to: "links#downvote" 
    end 
    resources :comments 
    end 

    root to: "links#index" 
end 
+0

'params [: link_id]' is 'nil'. Откуда он должен быть? – ptd

+0

Я попытался добавить это в форму, но у меня все еще есть такая же ошибка. Вот как выглядела моя форма: 'form_for [@link, @comment = Comment.new (....' –

+0

Вы создавали '@ link' в действии' new'? Что выглядит маршрут вроде? – ptd

ответ

0

Если бы эта проблема раньше; ответ здесь:

Ancestry gem in Rails and Mutli Nesting

enter image description here

Проблема с ancestry (именно поэтому мы изменили обратно acts_as_tree) является то, что вы должны определить все предки в ancestry колонке (как против толькоparent_id столбец acts_as_tree).

Таким образом, при вызове .children объекта (где вы буквально заселенной ancestry с родителями верхнего уровня) список детей для что родительских (нет других).

Что вам нужно, так это ссылка на всю линию родословной. Это довольно сложно, но может быть достигнуто с помощью кода ниже:

#app/views/links/index.html.erb 
<%= render @link.comments if @post.comments.any? %> 

#app/views/links/_comment.html.erb 
<%= comment.title %> 
<%= render "form", locals: {link: @link} %> 
<%= render comment.children if comment.has_children? # > adds recursion (multi level nesting) %> 

#app/views/links/_form.html.erb 
<%= form_for link.comments.new do |c| %> 
    <%= c.text_field :body %> 
    <%= c.submit %> 
<% end %> 

Контроллер следующим образом:

#app/controllers/comments_controller.rb 
class CommentsController < ApplicationController 
    def create 
     @link = Link.find params[:link_id] 
     @comment = @link.comments.new ancesrtry: parent(params[:parent_id]) 
    end 

    private 

    def parent(param) 
     parents = Comment.find(param).pluck(:parent) 
     "#{parents}/#{param}" #-> ruby automatically returns last line 
    end 
end 

Это должно установить правильный путь для вас, и парциальные должны дать вам необходима соответствующая рекурсия для многоуровневого вложения.

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