Добавить функцию редактирования и удаления в комментариях, пересмотренных по modorphic-ассоциации

Я прочитал это http://railscasts.com/episodes/154-polymorphic-association-revised публикует и реализует его как есть. Но я хочу добавить и редактировать и удалять функции в этом туториале. У меня есть комментарии_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

my _comments.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

Мои рейк-маршруты подобны

 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
2
nl ja de
Нет ресурсов: комментарии нужны?
добавлено автор Kick Buttowski, источник

3 ответы

Вот так....? Это предполагает, что ваши маршруты вложены в: Редактировать и: обновлять действия под «комментариями».

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

Однако ... вы захотите получить некоторую аутентификацию и/или авторизацию.

1
добавлено
и где я должен поместить ссылку для редактирования и удаления.
добавлено автор regmiprem, источник
Я сделал внутри _comments.html.erb, как этот <td> <% = link_to 'Edit', edit_comment_path (комментарий)%> </td> <td> <% = link_to 'Destroy', comment,: confirm => 'Are вы уверены??:: method =>: delete%> </td> Но это дает ошибку, например, неопределенную локальную переменную или метод `comment 'для # <# : 0x00000003851918>
добавлено автор regmiprem, источник
Это дает мне неопределенный метод `edit_comments_path 'для # <# <Класс: 0x007f6e480b2af8>: 0x007f6e48149250> Извлеченный источник (вокруг строки # 8): 5: </div> 6: <% end%> 7: </div> 8: <% = link_to 'Edit', [: edit, @ comment.commentable, @comment]%>
добавлено автор regmiprem, источник
Я редактировал свой вопрос с помощью маршрутов. Вы можете посмотреть.
добавлено автор regmiprem, источник
@regmiprem все еще у вас проблемы с этим?
добавлено автор Vinay, источник
Зависит от того, как вы настраиваете маршруты. Можете ли вы добавить это к своему вопросу?
добавлено автор omarvelous, источник
Посмотрите мои обновления, я добавил ссылку на редактирование, которую вы должны использовать.
добавлено автор omarvelous, источник
Это очень странно .... Маршруты выглядят хорошо ... либо ссылка должна была работать на самом деле ... Запустите «рейк-маршруты» и вставьте свой результат.
добавлено автор omarvelous, источник

У меня нет много времени, чтобы взглянуть на это прямо сейчас, но в ответ на твит я отправляю код, который я использовал в своем тестовом приложении, и я должен работать. Я использую 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: " #{@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

Заметки:

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

Имейте в виду, что я использую:

  • Mongoid
  • Rails 3

Ура,

-Brandon

0
добавлено

Это действие уничтожения для полиморфной ассоциации, я уверен, что вы можете выяснить Edit :)

<Сильный> VIEW

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

<Сильный> CONTROLLER

def destroy
  @comment = Comment.find(params[:id])
  @commentable = @comment.commentable
  if @comment.destroy
    flash[:success] = "Comment Destroyed!"   
    redirect_to :back
  end
end
0
добавлено
pro.ruby
pro.ruby
1 181 участник(ов)

Язык программирования Ruby Additional docs: https://rubyreferences.github.io/rubyref/ Invite: https://telegram.me/joinchat/Be4rsT2NuB3CyJaF26j1kA Кто хочет компилировать: @crystal_ru (его синтаксис основан на Ruby) Участник @proDOT

Ruby, Rails, Hanami | dry-rb
Ruby, Rails, Hanami | dry-rb
1 180 участник(ов)

https://telegram.me/rubyjob - Ruby Job По вопросам - @eugene_shved

Ruby School .us
Ruby School .us
1 045 участник(ов)

Чат-болталка для учеников руби-школы и не только. Правила: https://telegra.ph/Pravila-chata-Rubi-shkoly-03-13

Random Ruby Chat
Random Ruby Chat
589 участник(ов)

Правила публикации вакансий: https://t.me/codenamecrud/60865

Rubyata
Rubyata
333 участник(ов)

Коммюнити Ruby и Ruby On Rails Флуд не приветствуются. Вакансии можно публиковать только и ТОЛЬКО по пятницам с хештегом #вакансия.

Ruby Talks
Ruby Talks
236 участник(ов)

Национальная Флеймотека

RubyRush
RubyRush
189 участник(ов)

rubyrush.ru программирование для самых новичков

Rails Chat
Rails Chat
87 участник(ов)

You are welcome to discuss Ruby On Rails development process and other stuff