2016-01-09 3 views
1

Удаление других вещей отлично работает. Он выглядит так же, как мой пост-контроллер (который работает), но не удаляет комментарии.Невозможно удалить модели комментариев в Rails

resources :comments, only: [:create, :destroy] 

_comment частичная

<% if current_user?(comment.user) %> 
    <%= link_to "[Delete]", comment, method: :delete, 
            data: { confirm: "You sure?" } %> 
<% end %> 

комментарии контроллер

before_action :logged_in_user, only: [:create, :destroy] 
    before_action :correct_user, only: :destroy 

    def destroy 
    @comment.destroy 
    # @comment = @post.comments.find(params[:id]).destroy 
    flash[:success] = "Comment deleted"  
    redirect_to @post 
    end 

    private 

    def correct_user 
     @comment = current_user.comments.find_by(id: params[:id]) 
     redirect_to request.referrer || root_url 
    end 
+0

Не могли бы вы добавить ваши маршруты, пожалуйста – Tobias

+0

добавлен к сообщению .. – katarina

+0

Вы получаете ошибку или что-то? – Tobias

ответ

5

Ваш before_action :correct_user перенаправляет запрос перед @comment.delete вызывается в destroy действия.

def correct_user 
    @comment = current_user.comments.find_by(id: params[:id]) 
    # This line below is the problem. 
    redirect_to request.referrer || root_url 
end 

Некоторые другие вещи, которые вы можете улучшить:

@comment = current_user.comments.find_by(id: params[:id]) 

find_by избыточен здесь. Если вы используете id для извлечения записи, используйте find.

@comment = current_user.comments.find(params[:id]) 

find также имеет преимущество приподняв ActiveRecord::RecordNotFound ошибку, которая переводит на 404 не нашел ответа на производстве.

Если вы хотите перенаправить обратно, вам не нужно делать это:

redirect_to request.referrer || root_url 

Вы можете просто сделать redirect_to :back, что в Rails.

И, наконец, я бы переименовал correct_user в set_comment. Я не думаю, что correct_user выражает намерение кода, который должен загрузить комментарий. Вы должны закончить с этим:

before_action :set_comment, only: :destroy 

def destroy 
    @comment.destroy 
    redirect_to :back 
end 

def set_comment 
    @comment = current_user.comments.find(params[:id]) 
end 
Смежные вопросы