简体   繁体   English

Rails 虚荣 URL 防止#edit 工作

[英]Rails vanity URL preventing #edit from working

Users can create and edit stories (basically blogs).用户可以创建和编辑故事(基本上是博客)。 I set up a custom vanity URL for the stories, so instead of just the incrementing id, it displays /stories/1-some-story-title .我为故事设置了一个自定义虚荣 URL ,因此它不仅显示递增的 id,还显示/stories/1-some-story-title That works well for #show, but when I try to edit the story, (which uses the /stories/1-some-story-title/edit route) I see an error:这适用于#show,但是当我尝试编辑故事(使用/stories/1-some-story-title/edit路由)时,我看到一个错误:

Routing Error:
No route matches [POST] "/stories/1-some-story-title/edit"

However if I try to visit the non-vanity URL manually ( /stories/1/edit ) it works, so it's definitely something with the vanity URL not being looked up in the db properly, I just haven't been able to sort out exactly why yet.但是,如果我尝试手动访问非虚荣 URL ( /stories/1/edit )它可以工作,所以它肯定是虚荣 URL 没有在数据库中正确查找,我只是无法整理究竟为什么。

It seems odd to me that Rails can lookup the story without issue for #show, but runs into issues with #edit在我看来,Rails 可以毫无问题地为#show 查找故事,但在使用 #edit 时遇到问题,这对我来说似乎很奇怪

It's worth noting that I'm using Active Admin , and Action Text (Trix) as well.值得注意的是,我也在使用Active AdminAction Text (Trix)。

Any guidance is appreciated.任何指导表示赞赏。 I'm still getting the hang of Rails, so any articles you've found helpful are certainly welcome too.我仍然掌握 Rails 的窍门,因此当然也欢迎您发现有帮助的任何文章。


Stories Controller #show, #edit and #update故事 Controller #show、#edit 和 #update

  def show
    @story = Story.find(params[:id])
  end

  def edit
    @story = Story.find(params[:id])
    unless @current_user.is_admin?
      redirect_to root_path if @story.created_at < 2.hours.ago
      redirect_to root_path unless @current_user == @story.user
    end
  end

  def update
    @story = Story.find(params[:id])
    if @story.user == @current_user || @current_user.is_admin?
      if @story.update(form_params)
        redirect_to story_path(@story)
      else
        render 'edit'
      end
    else
      redirect_to root_path
    end
  end

models/story.rb模型/story.rb

class Story < ApplicationRecord


  # A story can have many comments
  has_many :comments, dependent: :destroy
  # A story can have many favourites
  has_many :favourites, dependent: :destroy
  # A story can only belong to one user
  belongs_to :user

  # Add Trix Rich Text Editor
  has_rich_text :body

  # Add image uploader
  mount_uploader :image, ImageUploader

  validates :title, presence: true
  validates :body, presence: true, length: { minimum: 10 }

  # Changing story URL from number to story title
  def to_param
    id.to_s + '-' + title.parameterize
  end

end


Routes.rb路由.rb

Rails.application.routes.draw do
  ActiveAdmin.routes(self)
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html

  # Routes for stories
  resources :stories do
    resources :comments
    resource :favourite
  end

  # routes for users
  resources :users
  # Routes for sessions
  resource :session

  # Set homepage as stories index page
  root 'stories#index'

  # Add new pages and their urls
  get 'about', to: 'pages#about'
  get 'our-story', to: 'pages#our_story'
  get 'terms-and-conditions', to: 'pages#terms'

  get 'favourites', to: 'favourites#index'
end


schema.rb架构.rb

ActiveRecord::Schema.define(version: 2021_05_17_183348) do

  create_table "action_text_rich_texts", force: :cascade do |t|
    t.string "name", null: false
    t.text "body"
    t.string "record_type", null: false
    t.bigint "record_id", null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["record_type", "record_id", "name"], name: "index_action_text_rich_texts_uniqueness", unique: true
  end

  create_table "active_admin_comments", force: :cascade do |t|
    t.string "namespace"
    t.text "body"
    t.string "resource_type"
    t.integer "resource_id"
    t.string "author_type"
    t.integer "author_id"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["author_type", "author_id"], name: "index_active_admin_comments_on_author"
    t.index ["namespace"], name: "index_active_admin_comments_on_namespace"
    t.index ["resource_type", "resource_id"], name: "index_active_admin_comments_on_resource"
  end

  create_table "active_storage_attachments", force: :cascade do |t|
    t.string "name", null: false
    t.string "record_type", null: false
    t.integer "record_id", null: false
    t.integer "blob_id", null: false
    t.datetime "created_at", null: false
    t.index ["blob_id"], name: "index_active_storage_attachments_on_blob_id"
    t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true
  end

  create_table "active_storage_blobs", force: :cascade do |t|
    t.string "key", null: false
    t.string "filename", null: false
    t.string "content_type"
    t.text "metadata"
    t.string "service_name", null: false
    t.bigint "byte_size", null: false
    t.string "checksum", null: false
    t.datetime "created_at", null: false
    t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true
  end

  create_table "active_storage_variant_records", force: :cascade do |t|
    t.integer "blob_id", null: false
    t.string "variation_digest", null: false
    t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true
  end

  create_table "comments", force: :cascade do |t|
    t.text "body"
    t.integer "story_id", null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.integer "user_id"
    t.index ["story_id"], name: "index_comments_on_story_id"
  end

  create_table "favourites", force: :cascade do |t|
    t.integer "story_id", null: false
    t.integer "user_id", null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["story_id"], name: "index_favourites_on_story_id"
    t.index ["user_id"], name: "index_favourites_on_user_id"
  end

  create_table "pages", force: :cascade do |t|
    t.string "title"
    t.text "body"
    t.string "url"
    t.string "image"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

  create_table "stories", force: :cascade do |t|
    t.string "title"
    t.text "body"
    t.string "topic"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.integer "user_id"
    t.string "image"
  end

  create_table "users", force: :cascade do |t|
    t.string "first_name"
    t.string "last_name"
    t.string "username"
    t.string "email"
    t.string "password_digest"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.boolean "is_admin", default: false
    t.string "avatar"
  end

  add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id"
  add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id"
  add_foreign_key "comments", "stories"
  add_foreign_key "favourites", "stories"
  add_foreign_key "favourites", "users"
end

Fixed it.解决它。 Needed to add:需要补充:

  def to_param
    id.to_s + '-' + title.parameterize
  end

to the app/admin/stories.rb file.app/admin/stories.rb文件。 It was already included in the story.rb model, but not in the directory for Active Admin.它已经包含在story.rb model 中,但不在 Active Admin 的目录中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM