| @@ -4,4 +4,12 @@ class Post < ApplicationRecord | |||||
| has_many :post_tags, dependent: :destroy | has_many :post_tags, dependent: :destroy | ||||
| has_many :tags, through: :post_tags | has_many :tags, through: :post_tags | ||||
| has_many :user_post_views, dependent: :destroy | has_many :user_post_views, dependent: :destroy | ||||
| has_one_attached :thumbnail | |||||
| def as_json options = { } | |||||
| super(options).merge({ thumbnail: thumbnail.attached? ? | |||||
| Rails.application.routes.url_helpers.rails_blob_url( | |||||
| thumbnail, only_path: false) : | |||||
| nil }) | |||||
| end | |||||
| end | end | ||||
| @@ -85,3 +85,5 @@ Rails.application.configure do | |||||
| # Skip DNS rebinding protection for the default health check endpoint. | # Skip DNS rebinding protection for the default health check endpoint. | ||||
| # config.host_authorization = { exclude: ->(request) { request.path == "/up" } } | # config.host_authorization = { exclude: ->(request) { request.path == "/up" } } | ||||
| end | end | ||||
| Rails.application.routes.default_url_options[:host] = 'hub.nizika.monster/api' | |||||
| @@ -0,0 +1,57 @@ | |||||
| # This migration comes from active_storage (originally 20170806125915) | |||||
| class CreateActiveStorageTables < ActiveRecord::Migration[7.0] | |||||
| def change | |||||
| # Use Active Record's configured type for primary and foreign keys | |||||
| primary_key_type, foreign_key_type = primary_and_foreign_key_types | |||||
| create_table :active_storage_blobs, id: primary_key_type 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 | |||||
| if connection.supports_datetime_with_precision? | |||||
| t.datetime :created_at, precision: 6, null: false | |||||
| else | |||||
| t.datetime :created_at, null: false | |||||
| end | |||||
| t.index [ :key ], unique: true | |||||
| end | |||||
| create_table :active_storage_attachments, id: primary_key_type do |t| | |||||
| t.string :name, null: false | |||||
| t.references :record, null: false, polymorphic: true, index: false, type: foreign_key_type | |||||
| t.references :blob, null: false, type: foreign_key_type | |||||
| if connection.supports_datetime_with_precision? | |||||
| t.datetime :created_at, precision: 6, null: false | |||||
| else | |||||
| t.datetime :created_at, null: false | |||||
| end | |||||
| t.index [ :record_type, :record_id, :name, :blob_id ], name: :index_active_storage_attachments_uniqueness, unique: true | |||||
| t.foreign_key :active_storage_blobs, column: :blob_id | |||||
| end | |||||
| create_table :active_storage_variant_records, id: primary_key_type do |t| | |||||
| t.belongs_to :blob, null: false, index: false, type: foreign_key_type | |||||
| t.string :variation_digest, null: false | |||||
| t.index [ :blob_id, :variation_digest ], name: :index_active_storage_variant_records_uniqueness, unique: true | |||||
| t.foreign_key :active_storage_blobs, column: :blob_id | |||||
| end | |||||
| end | |||||
| private | |||||
| def primary_and_foreign_key_types | |||||
| config = Rails.configuration.generators | |||||
| setting = config.options[config.orm][:primary_key_type] | |||||
| primary_key_type = setting || :primary_key | |||||
| foreign_key_type = setting || :bigint | |||||
| [ primary_key_type, foreign_key_type ] | |||||
| end | |||||
| end | |||||
| @@ -0,0 +1,5 @@ | |||||
| class RemoveThumbnailFromPosts < ActiveRecord::Migration[8.0] | |||||
| def change | |||||
| remove_column :posts, :thumbnail, :string | |||||
| end | |||||
| end | |||||
| @@ -1,5 +1,5 @@ | |||||
| <!doctype html> | <!doctype html> | ||||
| <html lang="en"> | |||||
| <html lang="ja"> | |||||
| <head> | <head> | ||||
| <meta charset="UTF-8" /> | <meta charset="UTF-8" /> | ||||
| <link rel="icon" type="image/svg+xml" href="/vite.svg" /> | <link rel="icon" type="image/svg+xml" href="/vite.svg" /> | ||||
| @@ -21,15 +21,14 @@ const HomePage = () => { | |||||
| return ( | return ( | ||||
| <div className="flex flex-wrap gap-4 p-4"> | <div className="flex flex-wrap gap-4 p-4"> | ||||
| {posts.map((post) => ( | |||||
| {posts.map (post => ( | |||||
| <Link | <Link | ||||
| to={`/posts/${post.id}`} | to={`/posts/${post.id}`} | ||||
| key={post.id} | key={post.id} | ||||
| className="w-40 h-40 overflow-hidden rounded-lg shadow-md hover:shadow-lg" | className="w-40 h-40 overflow-hidden rounded-lg shadow-md hover:shadow-lg" | ||||
| > | > | ||||
| <img | <img | ||||
| src={post.image_url} | |||||
| alt={post.title} | |||||
| src={post.thumbnail} | |||||
| className="object-cover w-full h-full" | className="object-cover w-full h-full" | ||||
| /> | /> | ||||
| </Link> | </Link> | ||||