【问题标题】:Add Edit and Delete feature in comment polymorphic-association-revised posts在评论多态关联修订帖子中添加编辑和删除功能
【发布时间】:2013-01-29 07:45:46
【问题描述】:

我阅读了这个http://railscasts.com/episodes/154-polymorphic-association-revised 帖子并按原样实施。但我也想在本教程中添加编辑和删除功能。 我的cmets_controller.rb是这样的

class CommentsController < ApplicationController
  before_filter :load_commentable

  def index
    @comments = @commentable.comments
  end

  def new
    @comment = @commentable.comments.new
  end

  def create
    @comment = @commentable.comments.new(params[:comment])
    if @comment.save
      redirect_to @commentable, notice: "Comment created."
    else
      render :new
    end
  end

private

  def load_commentable
    resource, id = request.path.split('/')[1, 2]
    @commentable = resource.singularize.classify.constantize.find(id)
  end

  # def load_commentable
  #   klass = [Article, Photo, Event].detect { |c| params["#{c.name.underscore}_id"] }
  #   @commentable = klass.find(params["#{klass.name.underscore}_id"])
  # end
end

我的 _cmets.html.erb 是这样的

<div id="comments">
<% @comments.each do |comment| %>
  <div class="comment">
    <%= simple_format comment.content %>
  </div>
<% end %>
</div>

我的路线是这样的

Blog::Application.routes.draw do
  resources :articles do
    resources :comments
  end

  resources :photos do
    resources :comments
  end

  resources :events do
    resources :comments
  end
  resources :comments

  root to: 'articles#index'
end

我的 rake 路线是这样的

 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
            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
      photo_comments GET    /photos/:photo_id/comments(.:format)              comments#index
                     POST   /photos/:photo_id/comments(.:format)              comments#create
   new_photo_comment GET    /photos/:photo_id/comments/new(.:format)          comments#new
  edit_photo_comment GET    /photos/:photo_id/comments/:id/edit(.:format)     comments#edit
       photo_comment GET    /photos/:photo_id/comments/:id(.:format)          comments#show
                     PUT    /photos/:photo_id/comments/:id(.:format)          comments#update
                     DELETE /photos/:photo_id/comments/:id(.:format)          comments#destroy
              photos GET    /photos(.:format)                                 photos#index
                     POST   /photos(.:format)                                 photos#create
           new_photo GET    /photos/new(.:format)                             photos#new
          edit_photo GET    /photos/:id/edit(.:format)                        photos#edit
               photo GET    /photos/:id(.:format)                             photos#show
                     PUT    /photos/:id(.:format)                             photos#update
                     DELETE /photos/:id(.:format)                             photos#destroy
      event_comments GET    /events/:event_id/comments(.:format)              comments#index
                     POST   /events/:event_id/comments(.:format)              comments#create
   new_event_comment GET    /events/:event_id/comments/new(.:format)          comments#new
  edit_event_comment GET    /events/:event_id/comments/:id/edit(.:format)     comments#edit
       event_comment GET    /events/:event_id/comments/:id(.:format)          comments#show
                     PUT    /events/:event_id/comments/:id(.:format)          comments#update
                     DELETE /events/:event_id/comments/:id(.:format)          comments#destroy
              events GET    /events(.:format)                                 events#index
                     POST   /events(.:format)                                 events#create
           new_event GET    /events/new(.:format)                             events#new
          edit_event GET    /events/:id/edit(.:format)                        events#edit
               event GET    /events/:id(.:format)                             events#show
                     PUT    /events/:id(.:format)                             events#update
                     DELETE /events/:id(.:format)                             events#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
                root        /                                                 articles#index

【问题讨论】:

  • 资源 :cmets 不是必需的吗?

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2 railscasts


【解决方案1】:

像这样....?这假设您的路由嵌套在“可评论”路由下的 :Edit 和 :update 操作。

  def edit
    @comment = @commentable.comments.find(params[:id])
  end

  def create
    @comment = @commentable.comments.find(params[:id])
    if @comment.update_attributes(params[:comment])
      redirect_to @commentable, notice: "Comment updated."
    else
      render :edit
    end
  end

您的编辑应如下所示:

<%= link_to 'Edit', [:edit, @comment.commentable, @comment] %>

但是...您将需要某种身份验证和/或授权。

【讨论】:

  • 我在 _cmets.html.erb 里面是这样 'Are you sure?', :method => :delete %> 但它会给出错误,例如未定义的局部变量或方法 `comment' for #:0x00000003851918>
  • 它给了我未定义的方法 `edit_cmets_path' for #:0x007f6e48149250> 提取的源代码(在第 8 行附近):5:
    6: 7:
    8:
  • @regmiprem 你还有问题吗??
  • 这很奇怪......路线看起来不错......任何一个链接都应该实际工作......运行“rake routes”并粘贴您的输出。
  • 【解决方案2】:

    我现在没有太多时间来查看这个,但为了回应你的推文,我发布了我在我开始工作的测试应用程序中使用的代码。我在这里使用 HAML。

    在我的视图中调用编辑或删除链接时,我使用了这个部分:

    - @category.photos.each do |photo|
        = image_tag photo.image_url(:thumb)
        %figcaption
            = link_to "Change", [:edit, @category, photo]
    
            = link_to "Delete", [@category, photo], :method => :delete
    = link_to "New photo", [:new, @category, :photo]
    

    我的照片控制器:

    class PhotosController < ApplicationController
      def create
        @category = Category.find(params[:category_id])
        @photo = @category.photos.create!(params[:photo])
        redirect_to @category, :notice => "Photo created."
      end
    
      def edit
        @category = Category.find(params[:category_id])
        @photos = @category.photos
        @photo = @photos.find(params[:id])
      end
    
      def update
        @category = Category.find(params[:category_id])
        @photo = @category.photos.find(params[:id])
    
        respond_to do |format|
          if @photo.update_attributes(params[:photo])
            format.html { redirect_to @category, notice: "<i class=icon-ok /> #{@category.name} was successfully updated."}
            format.js
            format.json { head :no_content }
          else
            format.html { render action: "edit" }
            format.json { render json: @category.errors, status: :unprocessable_entity }
          end
        end
      end
      def new
        @category = Category.find(params[:category_id])
        @photo = @category.photos.new
      end
      def destroy
        @category = Category.find(params[:category_id])
        @photos = @category.photos
        @photo = @photos.find(params[:id])
        @photo.destroy
        redirect_to @category, :notice => "Photo deleted."
      end
    end
    

    在我的照片模型中,我有:

    class Photo
      include Mongoid::Document
      embedded_in :category, :inverse_of => :photos
    
      field :image
      attr_accessible :image
    
      # Set uploader
      mount_uploader :image, ImageUploader
    end
    

    在类别模型中:

    class Category
      # Includes to set up the model
      include Mongoid::Document
      include Mongoid::Timestamps
      include Mongoid::Ancestry
      include Mongoid::Versioning
      include Mongoid::Paranoia
      include Mongoid::Slug
      include Mongoid::History::Trackable
    
      # tell it that it can go nest itself
      has_ancestry
      embeds_many :photos
    
      # Accept nested attributes
      accepts_nested_attributes_for :photos, :autosave => true
      # tell history how it can track things
      track_history   :on => [:name, :description],   # track these fields
                      #:modifier_field => :modifier, # adds "referenced_in :modifier" to track who made the change, default is :modifier
                      :version_field => :version,   # adds "field :version, :type => Integer" to track current version, default is :version
                      :track_create   =>  false,    # track document creation, default is false
                      :track_update   =>  true,     # track document updates, default is true
                      :track_destroy  =>  false    # track document destruction, default is false
      # Keep at most 5 versions of a record
      max_versions 5
    
      # Add the models fields here
      field :name, type: String
      field :ancestry, type: String
      field :description, type: String
    
      # Set which field the url slug should use
      slug :name
    
      # Make sure these attributes can be accessed
      attr_accessible :ancestry, :name, :parent_id, :description
    
      # Make name fields capitalized on save
      def name=(t)
        write_attribute(:name, t.to_s.split(' ').map {|w| w.capitalize}.join(' '))
      end
    
      # Create some scopes
      scope :except, lambda{ |category| where("id <> ?", category.id)}
    end
    

    注意事项:

    我只是粘贴了一堆我的代码,因为我没有太多时间来解析它来具体回答。 希望我编写一些代码的方式可以帮助到您。

    请记住,我正在使用:

    • 蒙古人
    • 导轨 3

    干杯,

    -布兰登

    【讨论】:

      【解决方案3】:

      这是多态关联的销毁动作,我相信你可以弄清楚编辑:)

      查看

      <%= link_to content_tag(:i, "", class: "icon-trash icons"), [@commentable, comment], method: :delete,
                             data: { confirm: "Are you sure?" },
                             title: "Delete" %>
      

      控制器

      def destroy
        @comment = Comment.find(params[:id])
        @commentable = @comment.commentable
        if @comment.destroy
          flash[:success] = "Comment Destroyed!"   
          redirect_to :back
        end
      end
      

      【讨论】:

        猜你喜欢
        • 2019-02-20
        • 1970-01-01
        • 1970-01-01
        • 2019-11-09
        • 1970-01-01
        • 2022-11-10
        • 1970-01-01
        • 2021-06-24
        • 2019-09-25
        相关资源
        最近更新 更多