我正在尝试在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']
我不确定为什么我删除评论的尝试被定向到文章控制器中的销毁操作。
答案 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 %>