2016-01-03 2 views
1

Я пытаюсь сделать приложение в Rails 4.Rails 4 - удалить по полиморфному атрибуту

У меня есть модель модели и модель комментариев.

Ассоциации являются:

article.rb

has_many :comments, as: :commentable, dependent: :destroy 
     accepts_nested_attributes_for :comments 

comment.rb

belongs_to :commentable, :polymorphic => true 

В моих статьях показывают вид, у меня есть:

<div class="row"> 
      <div class="col-sm-9"> 
       <div class="intpol3" style="text-align: left; margin-left:60px; padding-top:50px"> 
        <%= safe_join(@article.body.split("\r\n"), "<br />".html_safe) %> 
       </div> 
      </div> 
      <div class="col-sm-3"> 
      <!-- placeholder for tags --> 
      </div> 

     </div> 

     <!-- if @article.user.full_name.present? --> 
      <!-- <div class="indexsubtext"> @article.user.full_name </div> --> 
     <!-- end --> 
     <div class="row"> 
      <div class="col-xs-8"> 
      </div> 
      <div class="col-xs-4"> 
       <div class="formminor" style="margin-bottom:5%"> 
        <%= link_to 'Edit', edit_article_path(@article) %> | 
        <%= link_to 'More from the blog', articles_path %> 
       </div> 
      </div>   
     </div> 

     <div class="row"> 
      <div class="col-xs-12"> 
       <%= render :partial => 'comments/form', locals: {commentable: @article} %> 
      </div> 
     </div>   
     <div class="row"> 
      <div class="col-xs-12"> 

       <div class="intpol3"> 

        <%= render :partial => 'comments/display', locals: {commentable: @article} %> 

       </div> 
      </div> 
     </div> 

В моей комментарии отображение частичный, У меня есть:

<div class="row"> 
     <div class="col-xs-11"> 
     <% commentable.comments.each do | comment | %> 
      <div class="well"> 
       <%= comment.opinion %> 
       <div class="commentattributionname"> 
        <%= comment.user.full_name %> 
       </div> 
       <div class="commentattributiontitle"> 
        <%= comment.user.formal_title %> 
       </div> 
       <div class="commentattributiondate"> 
        <%= comment.created_at.try(:strftime, '%e %B %Y') %> 
       </div> 
      </div> 

      <div class="col-xs-1"> 
       <%= button_to 'Delete', commentable.comment, :method => :delete %> 
      </div> 
     <% end %> 

Это все работало нормально, пока я не попытался добавить кнопку, чтобы удалить комментарий. Модель комментариев является полиморфной.

У меня есть два контроллера для комментариев (после gorails.com учебника), первых статей :: комментариев контроллер, который имеет:

class Articles::CommentsController < CommentsController 

before_action :set_commentable#, only: [:show, :edit, :update, :destroy] 


    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_commentable 
     @commentable = Article.find(params[:article_id]) 
    end 
end 

Вторые комментарии контроллер, который имеет:

class CommentsController < ApplicationController 

    before_action :authenticate_user! 

    def create 
    @comment = Comment.new comment_params 
    @comment.user = current_user 
    @comment.commentable = @commentable 

    respond_to do |format| 
    if @comment.save 
     format.html { redirect_to @commentable } 
     format.json { render :show, status: :created, location: @comment } 
    else 
     format.html { render :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 data_url } 
     format.json { head :no_content } 
     end 
    end 


    private 


    # Never trust parameters from the scary internet, only allow the white list through. 
    def comment_params 
     params.require(:comment).permit(:opinion) 
    end 
end 

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

разрушающего действия в контроллере статьи является:

def destroy 
    before_action :authenticate_user! 
    authorize @article 
    @article.destroy 
    respond_to do |format| 
     format.json { head :no_content } 
    end 
    end 

Сообщение об ошибке:

ActionController::UnknownFormat in ArticlesController#destroy 
ActionController::UnknownFormat 

respond_to строка выделена. Я не знаю, что означают эти слова - они автоматически вставлены, когда вы создаете контроллер, используя строительные леса. Тем не менее, я добавил реагировать форматировать к контроллеру, как:

respond_to :html, :son 

Я не знаю, почему моя попытка удалить комментарий направляется на действия уничтожить в контроллере статьи.

ответ

0

У вас не должно быть двух контроллеров для комментариев (Articles::Comments & Comments); вы должны придерживаться Articles::Comments и гнезда его на условиях Articles на маршрутах:

#config/routes.rb 
resources :articles do 
    resources :comments, module: :articles #-> url.com/articles/:article_id/comments/:id 
end 

#app/controllers/articles/comments_controller.rb 
class Articles::CommentsController < ApplicationController 
    before_action :set_commentable 

    def destroy 
     @comment = @article.comments.find params[:id] 
     @comment.destroy 
    end 

    private 

    def set_commentable 
     @article = Article.find params[:article_id] 
    end 
end 

Это позволит вам использовать следующие маршруты:

<%= button_to 'Delete', [commentable, comment], method: :delete %> 

-

Я думаю, что вы получаете путают с nested resources - всякий раз, когда вы устанавливаете маршруты, которые вложены под другими, у вас есть возможность передать как «родительский», так и «дочерний» ресурс на ваши маршруты.

Это работает в form_for, а также link_to/button_to - вы должны пройти ["parent.id", "child.id"] для того, чтобы вложенная маршрут, чтобы работать правильно.

-

Еще один хороший трюк заключается в использовании polymorphic_path, который будет автоматически устанавливать маршруты в зависимости от объектов, которые Вы передаете. Я не использовал его много, но, кажется, как-то вы могли бы извлечь выгоду из в этом случае:

<%= button_to 'Delete', polymorphic_path([commentable, comment]), method: :delete %> 
+0

Причины, имеющие два контроллера описаны в видео gorails по адресу: https://gorails.com/episodes/ комментарии-с-полиморфных-ассоциаций? автозапуск = 1. Я думаю, что ваши комментарии могут указывать на стилистическую разницу в подходе. Спасибо за подсказку на полиморфном пути. Я изучу это, чтобы узнать, смогу ли я решить проблему с этой идеей. – Mel

+0

Возможно, вы захотите посмотреть ['DRY'] (https://en.wikipedia.org/wiki/Don%27t_repeat_yourself). –

+0

Я не думаю, что в этом есть повторение. Спасибо, в любом случае. – Mel

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