Rails 4 - 删除多态属性

时间:2016-01-03 00:03:33

标签: ruby-on-rails controller polymorphic-associations

我正在尝试在Rails 4中创建一个应用程序。

我有文章模型和评论模型。

协会是:

article.rb

belongs_to :commentable, :polymorphic => true

comment.rb

<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 %>

在我的评论中显示部分,我有:

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

这一切都正常,直到我尝试添加按钮来删除评论。评论模型是多态的。

我有两个评论控制器(遵循gorails.com教程),第一个是文章::评论控制器,它有:

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

我想尝试删除评论 - 而不是文章。当我尝试这个时,错误消息说注释控制器中的destroy动作是问题。

文章控制器中的销毁操作是:

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

错误消息是:

respond_to :html, :son

respond_to行突出显示。我不知道这些词是什么意思 - 当你使用脚手架创建一个控制器时,它们会被自动插入。但是,我已将格式响应添加到控制器:

$_SERVER['REQUEST_URI']

我不确定为什么我删除评论的尝试被定向到文章控制器中的销毁操作。

1 个答案:

答案 0 :(得分:0)

您不应该有两个用于评论的控制器(Articles::Comments&amp; 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感到困惑 - 每当你设置嵌套在其他路线下的路线时,你就有机会同时传递&#34;父母&#34;和孩子&#34;你路线的资源。

这适用于form_for以及link_to / button_to - 您必须通过["parent.id", "child.id"]才能使嵌套路由正常工作。

-

另一个好方法是使用polymorphic_path,它将根据您传递的对象自动设置路线。我没有太多使用它,但在这种情况下似乎可以从中受益:

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