删除评论显示路线错误没有路线匹配{:action =>“show”,:controller =>“articles”,:id => nil}

时间:2013-04-27 08:45:05

标签: ruby-on-rails ruby hyperlink routing

我一直在删除文章的评论。我能够显示和编辑注释,但无法删除它们。我尝试了各种组合,并通过网络搜索,但可以找到合适的答案。我在comments / _comment.html.erb partial中添加了“删除”链接。

评论/ _comment.html.erv

<% if @article.comments.count  >= 1 %>
  <div style="border: px solid #66c9ee;border-radius: 0px 0px 0px 0px;margin: 10px -30px 15px; padding:     10px 15px 25px; background: none repeat scroll 0 0 #F2F2F2; width:700px; font-size: 1.2em;border-bottom: 0px solid #DDDDDD;">   
      <%= comment.content %>
         <div id="tabula"> 
            <ul id="tabula">
             <li> <div style="color: #0077CC;margin-rigth:200px; font-size: 1.0em;margin-top:4px;background-color:#;"> <%= comment.user.username if comment.user %></div></li>
            <li> <div style="color: #0077CC; background-color:; margin-top:4px; margin-left:25px;"> <p> <%= time_ago_in_words(comment.created_at.in_time_zone("Asia/Calcutta"))  unless comment.created_at.nil? %>  </p></div></li>
              <li> <div style="color: #0077CC; background-color:; margin-top:4px; margin-left:25px;"> <%= link_to "edit", edit_article_comment_path(@article ,comment) %> </div></li>
              <li> <div style="color: #0077CC; background-color:; margin-top:4px; margin-left:25px;"> <%= link_to 'Delete', article_comment_path(@article,comment), :confirm => 'Are you sure?', :method => :delete %> </div></li>
            </ul>
           </div>
    <% else %>
        <div style="color:#0077CC;margin-left:25px;font-size:1.4em;"> be first to comment</div>
  <% end %>

comments_articles.rb

class CommentsController < ApplicationController

    def new
      @comment = Comment.new
    end

    def create
      @article = Article.find(params[:article_id])
      @comment = @article.comments.build(params[:comment])
      @comment.user_id = current_user.id
      @comment.save
        flash[:success] = "Comment created!"
        redirect_to article_path(@comment.article)
    end

    def edit
     @comment =  Comment.find(params[:id])
     @article = @comment.article
     # @article = Article.find(params[:article_id])
     #@comment = @article.comments
    end   

    def update
     @comment = Comment.find(params[:id])
     @article = @comment.article
      if @comment.update_attributes(params[:comment])
        flash[:success] = "Comment updated!"
        redirect_to article_path(@article)
      else
       render :action => "edit" 
      end
    end

    def destroy

      @article = Article.find(params[:article_id])
      @comment = @article.comments.find(params[:id])
      @comment.destroy
      redirect_to article_path(@artilce) 
    end

end

佣金路线

    articles GET    /articles(.:format)                               articles#index
                      POST   /articles(.:format)                               articles#create
          new_article GET    /articles/new(.:format)                           articles#new
         edit_article GET    /articles/:id/edit(.:format)                      articles#edit
              article GET    /articles/:id(.:format)                           articles#show
                      PUT    /articles/:id(.:format)                           articles#update
                      DELETE /articles/:id(.:format)                           articles#destroy
      dashboard_index GET    /dashboard(.:format)                              dashboard#index
                      POST   /dashboard(.:format)                              dashboard#create
        new_dashboard GET    /dashboard/new(.:format)                          dashboard#new
       edit_dashboard GET    /dashboard/:id/edit(.:format)                     dashboard#edit
            dashboard GET    /dashboard/:id(.:format)                          dashboard#show
                      PUT    /dashboard/:id(.:format)                          dashboard#update
                      DELETE /dashboard/:id(.:format)                          dashboard#destroy
                 tags GET    /tags(.:format)                                   tags#index
                      POST   /tags(.:format)                                   tags#create
              new_tag GET    /tags/new(.:format)                               tags#new
             edit_tag GET    /tags/:id/edit(.:format)                          tags#edit
                  tag GET    /tags/:id(.:format)                               tags#show
                      PUT    /tags/:id(.:format)                               tags#update
                      DELETE /tags/:id(.:format)                               tags#destroy
             comments GET    /comments(.:format)                               comments#index
                      POST   /comments(.:format)                               comments#create
          new_comment GET    /comments/new(.:format)                           comments#new
         edit_comment GET    /comments/:id/edit(.:format)                      comments#edit
              comment GET    /comments/:id(.:format)                           comments#show
                      PUT    /comments/:id(.:format)                           comments#update
                      DELETE /comments/:id(.:format)                           comments#destroy
     article_comments GET    /articles/:article_id/comments(.:format)          comments#index
                      POST   /articles/:article_id/comments(.:format)          comments#create
  new_article_comment GET    /articles/:article_id/comments/new(.:format)      comments#new
 edit_article_comment GET    /articles/:article_id/comments/:id/edit(.:format) comments#edit
      article_comment GET    /articles/:article_id/comments/:id(.:format)      comments#show
                      PUT    /articles/:article_id/comments/:id(.:format)      comments#update
                      DELETE /articles/:article_id/comments/:id(.:format)      comments#destroy
                      GET    /articles(.:format)                               articles#index
                      POST   /articles(.:format)                               articles#create
                      GET    /articles/new(.:format)                           articles#new
                      GET    /articles/:id/edit(.:format)                      articles#edit
                      GET    /articles/:id(.:format)                           articles#show
                      PUT    /articles/:id(.:format)                           articles#update
                      DELETE /articles/:id(.:format)                           articles#destroy

articles_controller.rb

class ArticlesController < ApplicationController
  before_filter :is_user_admin, only: [:new, :create, :edit, :destroy]
  before_filter :log_impression, :only=> [:show]

    def is_user_admin
      redirect_to(action: :index) unless current_user.try(:is_admin?) 
      return false 
    end

   def log_impression
     @article = Article.find(params[:id])
     # this assumes you have a current_user method in your authentication system
      @article.impressions.create(ip_address: request.remote_ip,user_id:current_user.id)
   end

      def index
          @articles = Article.all(:order => "created_at DESC")
      @article_titles = Article.first(10)
      @tags = Tag.all
      end

    def show
      @article = Article.find(params[:id])
      @related_articles = Article.joins(:taggings).where('articles.id != ?', @article.id).where(taggings: { tag_id: @article.tag_ids })           
      @article_popular =  Article.order('articles.impressions_count DESC').limit(5)
    end

      def new
      @article = Article.new
      end

    def create
      @article = Article.new(params[:article])
      @article.user_id = current_user.id
      if @article.save
        flash[:success] = "article created!"
        redirect_to article_path(@article)
      else
        render 'new' 
      end 
    end

    def destroy
      @article = Article.find(params[:id])
      @article.destroy
      redirect_to action:  'index'  
    end

    def edit
      @article = Article.find(params[:id])
    end

    def update
      @article = Article.find(params[:id])
      if @article.update_attributes(params[:article])
       flash.notice = "Article '#{@article.title}' Updated!"
       redirect_to article_path(@article)
      else 
        render 'edit'
      end
    end
end

物品/ show.html.erb

<div class="row-fluid">
  <div class="span12">
  <div class ="span9">
    <div class ="row-fluid">

      <div id="upperborder">
          <div id="lowerborder">
            <div style="color:#1fb2e8;font-size:2.3em;"><%= @article.title %></div>
             <div id="tabs"> 
              <ul id="tabs">
              <li>  <%= time_tag(@article.created_at.in_time_zone("Asia/Calcutta")) %> </li>
              <li>   <%= @article.user.username if @article.user %></li>
               <li>
                 <% unless @article.comments.empty? %>
                 (<%= @article.comments.size %>) comments
                 <% end %>
                 </li>
                 <li>
                 <% @article.tags.each do |tag| %>
                  <%= link_to tag.name, tag_path(tag) %>
                <% end %>     
              </li>
             </ul>
           </div>            

         <hr id="upperline">
         <div style="font-size: 1.2em"><%= @article.body %></div>

       <div id="tabs"> 
          <ul id="tabs">
            <div style="margin-top:20px; margin-left:10px"> <li> <%= link_to "back",articles_path, :class => ''  %></li></div>
             <% if current_user.try (:is_admin) %>
              <div style="margin-top:20px;margin-left:-10px""> <li> <%= link_to "edit", edit_article_path(@article), :class => '' %></li> </div>
              <div style="margin-top:20px"> <li> <%= link_to "delete",article_path(@article),:method => :delete,:confirm => 'Are you sure?',:class => '' %></li> </div>
            <% end %>
          </ul>
        </div>       

       <div id="fabs">
         <ul id="fabula">
           <div style="margin-left:250px; font-size:1.2em;color:#1fb2e8;margin-top:-0px">  Viewed: <%=@article.impression_count %> times, 
           <% if (@article.created_at != @article.updated_at) %>
           edit: <%= time_ago_in_words(@article.updated_at) %> ago,
           <% end %>
           <% if ! @article.comments.empty? %>
           Active: <%=  time_ago_in_words(@article.comments.last.created_at) %> ago
           <% end %>
           </div>
         </ul>
       </div>

       <hr style="border: 1px solid #E0E0F0; margin-top:50px">
       <div id="commentform">
         <%= render :partial => 'comments/comment_form' %>
           <% @article.comments.each do |c| %>
             <% if !c.nil? %>
               <div id ="commentdisplay"> <%= render partial: 'comments/comment', :locals => { :comment => c } %> </div>
             <% end %> 
            <% end %> 
       </div> 
      </div>
     </div>
   </div>

       <div class="span3">    
         <div id="popular"> 
          <% if !@article_popular.empty? %>
            <div id="headerpopular"> most viewed articles </div>
             <% @article_popular.each do |article_popular| %>
              <div id="popular-title">  <%= link_to  truncate(article_popular.title, :length => 35, :separator => ' '),  article_path(article_popular) %></div>
             <% end %>
          <% end %>
        </div>
     </div>
   </div>

       <% if !@related_articles.empty? %>
          <div id = "related-border">
          <div id="related-title"> Related articles </div>
          <% @related_articles.each do | related_article | %>       
          <div id="related-title-link">  <%= link_to  truncate(related_article.title, :length => 35, :separator => ' '),  article_path(related_article) %></div>
        <% end %>
        </div> 
        <% else %>
          <div id="related-border">
          <div id="ygm"> You got us ! </div>
          <div id="nofound"><h3> no related article found :(</h3></div>
          </div> 
        <% end %>

当我点击“删除”链接时,它说没有路由匹配{:action =&gt;“show”,:controller =&gt;“articles”,:id =&gt; nil}。我不知道,为什么它是指向ot文章控制器。我在这里使用了嵌套路由,而评论的网址是http://localhost:3000/articles/43/comments/49例如。文章的所有评论都显示在artilce的显示页面上。如果你在这里了解更多信息,请告诉我。

2 个答案:

答案 0 :(得分:2)

您的CommentsController#destroy行动中有错字:

redirect_to article_path( @artilce )

应该是

redirect_to article_path( @article ) 

(注意@artilce

所以我猜你的破坏行为有效,但重定向不会因为@artilce返回nil(因此奇怪的错误消息)。

答案 1 :(得分:0)

更改

<%= link_to 'Delete', article_comment_path(@article,comment), :confirm => 'Are you sure?', :method => :delete %>

<%= link_to 'Destroy Comment', [comment.article, comment], :confirm => 'Are you sure?',   :method => :delete %>

您可以获得更多信息:http://guides.rubyonrails.org/getting_started.html#deleting-comments