[英]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 Admin
和Action 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 的窍门,因此当然也欢迎您发现有帮助的任何文章。
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
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
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
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.