0

我有两个模型:文章和段落。一篇文章可以包含很多段落。文章型号:

class Article < ApplicationRecord
  #enum category: {wiki: "Wiki", rules: "Rules", blog: "Blog", draft: "Draft"}
  enum category: [:wiki, :rules, :blog, :draft]
  after_initialize :set_default_category, :if => :new_record?

  def set_default_category
    self.category ||= :draft
  end

  belongs_to :user
  has_many :paragraphs, dependent: :destroy
  accepts_nested_attributes_for :paragraphs, allow_destroy: true, reject_if: proc { |attr| attr['content'].blank? }
  has_one_attached :article_image
end

款型:

class Paragraph < ApplicationRecord
  belongs_to :article
  has_one_attached :pragraph_image
  has_rich_text :content
end

文章控制者:

class Admin::ArticlesController < ApplicationController
  before_action :set_article, only: %i[ show edit update destroy ]

  def index
    @articles = Article.all
  end

  def show
  end

  def new
    @article = Article.new
  end

  def edit
    authorize [:admin, Article], :edit?
  end

  def create
    @article = current_user.articles.build(article_params)
    authorize [:admin, Article], :create?

    respond_to do |format|
      if @article.save
        format.html { redirect_to admin_article_path(@article), notice: "Article was successfully created." }
        format.json { render :show, status: :created, location: @article }
      else
        format.html { render :new, status: :unprocessable_entity }
        format.json { render json: @article.errors, status: :unprocessable_entity }
      end
    end
  end

  def update
    authorize [:admin, Article], :update?
    respond_to do |format|
      if @article.update(article_params)
        @article.paragraphs.build
        format.html { redirect_to admin_article_path(@article), notice: "Article was successfully updated." }
        format.json { render :show, status: :ok, location: @article }
      else
        format.html { render :edit, status: :unprocessable_entity }
        format.json { render json: @article.errors, status: :unprocessable_entity }
      end
    end
  end

  def destroy
    authorize [:admin, Article], :destroy?
    @article.destroy

    respond_to do |format|
      format.html { redirect_to admin_articles_path, notice: "Article was successfully destroyed." }
      format.json { head :no_content }
    end
  end

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

    def article_params
      params.require(:article).permit(:article_image, :name, :description, :category, :user_id,
                                      paragraphs_attributes: [:_destroy, :id, :content] )
    end
end

段落控制器:

class Admin::ParagraphsController < ApplicationController
  before_action :set_article
  before_action :set_paragraph, only: %i[ update destroy ]

  def update
    authorize [:admin, Article], :update?
    respond_to do |format|
      if @paragraph.update(article_params)
        format.html { redirect_to admin_article_path(@article), notice: "Article was successfully updated." }
        format.json { render :show, status: :ok, location: @article }
      else
        format.html { render :edit, status: :unprocessable_entity }
        format.json { render json: @article.errors, status: :unprocessable_entity }
      end
    end
  end

  def destroy
    authorize [:admin, Article], :update?
    @paragraph.destroy
    respond_to do |format|
      format.html { redirect_to admin_article_path(@article), notice: 'Post was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    def set_article
      @article = Article.find(params[:article_id])
    end

    def set_paragraph
      @paragraph = @article.paragraphs.find(params[:id])
    end


    def article_params
      params.require(:paragraph).permit(:content, :article_id)
    end
end

我在 show.html.haml 中的链接(查看文章,我可以在其中添加/编辑/删除段落):

= link_to 'X', admin_article_paragraph_path(@article, paragraph),
                         :method => :delete,
                         data: { "turbo-method": :delete, confirm: "Are you sure?" },
                         :class => "btn btn-danger"

路线(管理部分):

  # Admin routes
  namespace :admin do
    root to: 'dashboard#index'
    resources :users

    resources :articles do
      resources :paragraphs, only: [:update, :destroy]
    end
  end

所以,当我尝试删除段落时,也会删除文章。我在控制台中看到的:

Started DELETE "/admin/articles/62/paragraphs/42" for 127.0.0.1 at 2022-02-08 16:50:10 +0300
Processing by Admin::ParagraphsController#destroy as TURBO_STREAM
  Parameters: {"article_id"=>"62", "id"=>"42"}
  User Load (0.8ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 0], ["LIMIT", 1]]
  Article Load (1.4ms)  SELECT "articles".* FROM "articles" WHERE "articles"."id" = $1 LIMIT $2  [["id", 62], ["LIMIT", 1]]
  ↳ app/controllers/admin/paragraphs_controller.rb:29:in `set_article'
  Paragraph Load (0.5ms)  SELECT "paragraphs".* FROM "paragraphs" WHERE "paragraphs"."article_id" = $1 AND "paragraphs"."id" = $2 LIMIT $3  [["article_id", 62], ["id", 42], ["LIMIT", 1]]
  ↳ app/controllers/admin/paragraphs_controller.rb:33:in `set_paragraph'
  TRANSACTION (0.2ms)  BEGIN
  ↳ app/controllers/admin/paragraphs_controller.rb:20:in `destroy'
  ActiveStorage::Attachment Load (0.6ms)  SELECT "active_storage_attachments".* FROM "active_storage_attachments" WHERE "active_storage_attachments"."record_id" = $1 AND "active_storage_attachments"."record_type" = $2 AND "active_storage_attachments"."name" = $3 LIMIT $4  [["record_id", 42], ["record_type", "Paragraph"], ["name", "pragraph_image"], ["LIMIT", 1]]
  ↳ app/controllers/admin/paragraphs_controller.rb:20:in `destroy'
  ActionText::RichText Load (0.4ms)  SELECT "action_text_rich_texts".* FROM "action_text_rich_texts" WHERE "action_text_rich_texts"."record_id" = $1 AND "action_text_rich_texts"."record_type" = $2 AND "action_text_rich_texts"."name" = $3 LIMIT $4  [["record_id", 42], ["record_type", "Paragraph"], ["name", "content"], ["LIMIT", 1]]
  ↳ app/controllers/admin/paragraphs_controller.rb:20:in `destroy'
  ActiveStorage::Attachment Load (0.2ms)  SELECT "active_storage_attachments".* FROM "active_storage_attachments" WHERE "active_storage_attachments"."record_id" = $1 AND "active_storage_attachments"."record_type" = $2 AND "active_storage_attachments"."name" = $3  [["record_id", 17], ["record_type", "ActionText::RichText"], ["name", "embeds"]]
  ↳ app/controllers/admin/paragraphs_controller.rb:20:in `destroy'
  ActionText::RichText Destroy (15.7ms)  DELETE FROM "action_text_rich_texts" WHERE "action_text_rich_texts"."id" = $1  [["id", 17]]
  ↳ app/controllers/admin/paragraphs_controller.rb:20:in `destroy'
  Paragraph Destroy (4.5ms)  DELETE FROM "paragraphs" WHERE "paragraphs"."id" = $1  [["id", 42]]
  ↳ app/controllers/admin/paragraphs_controller.rb:20:in `destroy'
  TRANSACTION (16.0ms)  COMMIT
  ↳ app/controllers/admin/paragraphs_controller.rb:20:in `destroy'
Redirected to http://127.0.0.1:3000/admin/articles/62
Completed 302 Found in 158ms (ActiveRecord: 55.6ms | Allocations: 11283)


Started DELETE "/admin/articles/62" for 127.0.0.1 at 2022-02-08 16:50:11 +0300
Processing by Admin::ArticlesController#destroy as TURBO_STREAM
  Parameters: {"id"=>"62"}
  User Load (13.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 0], ["LIMIT", 1]]
  Article Load (4.9ms)  SELECT "articles".* FROM "articles" WHERE "articles"."id" = $1 LIMIT $2  [["id", 62], ["LIMIT", 1]]
  ↳ app/controllers/admin/articles_controller.rb:60:in `set_article'
  TRANSACTION (0.1ms)  BEGIN
  ↳ app/controllers/admin/articles_controller.rb:50:in `destroy'
  Paragraph Load (0.3ms)  SELECT "paragraphs".* FROM "paragraphs" WHERE "paragraphs"."article_id" = $1  [["article_id", 62]]
  ↳ app/controllers/admin/articles_controller.rb:50:in `destroy'
  ActiveStorage::Attachment Load (0.8ms)  SELECT "active_storage_attachments".* FROM "active_storage_attachments" WHERE "active_storage_attachments"."record_id" = $1 AND "active_storage_attachments"."record_type" = $2 AND "active_storage_attachments"."name" = $3 LIMIT $4  [["record_id", 62], ["record_type", "Article"], ["name", "article_image"], ["LIMIT", 1]]
  ↳ app/controllers/admin/articles_controller.rb:50:in `destroy'
  Article Destroy (25.7ms)  DELETE FROM "articles" WHERE "articles"."id" = $1  [["id", 62]]
  ↳ app/controllers/admin/articles_controller.rb:50:in `destroy'
  TRANSACTION (97.2ms)  COMMIT
  ↳ app/controllers/admin/articles_controller.rb:50:in `destroy'
Redirected to http://127.0.0.1:3000/admin/articles
Completed 302 Found in 160ms (ActiveRecord: 142.1ms | Allocations: 5243)


Started DELETE "/admin/articles" for 127.0.0.1 at 2022-02-08 16:50:11 +0300
  
ActionController::RoutingError (No route matches [DELETE] "/admin/articles"):
  
Started GET "/admin/articles/62" for 127.0.0.1 at 2022-02-08 16:50:11 +0300
Processing by Admin::ArticlesController#show as HTML
  Parameters: {"id"=>"62"}
  User Load (1.5ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 0], ["LIMIT", 1]]
  Article Load (7.0ms)  SELECT "articles".* FROM "articles" WHERE "articles"."id" = $1 LIMIT $2  [["id", 62], ["LIMIT", 1]]
  ↳ app/controllers/admin/articles_controller.rb:60:in `set_article'
Completed 404 Not Found in 29ms (ActiveRecord: 8.5ms | Allocations: 2156)


  
ActiveRecord::RecordNotFound (Couldn't find Article with 'id'=62):
  
app/controllers/admin/articles_controller.rb:60:in `set_article'

我的错误在哪里?谢谢

4

0 回答 0