활성 저장 가져오기 방법 [투고 기능 + 이미지 설치와 결합 소개]

배치


현재 제작 중인 응용 프로그램에 투고 기능을 설치하고 싶습니다.
투고는 글과 그림을 투고할 수 있다.트위터의 투고 기능을 상상해 보면 이해하기 쉽다.

개발 환경


ruby '2.6.5'
rails '6.0.0'

현재 상태



응용 프로그램이 이미 사용자 관리 기능을 실현하였다.
로그인 후 첫 페이지로 이동하여 "안녕하세요, 미스터 제로"를 표시합니다.
devise 가져오는 방법은 아래 보도에서 확인하십시오.
https://qiita.com/ghexcffb/items/7f2b708ed34e84cca15b

이번 결승점.


로그인 상태의 사용자가 초상화 텍스트를 투고하여 맨 위에 표시할 수 있도록 합니다.이미지가 ActiveStarage에서 구현됩니다.

실시


post 모델과 테이블을 만듭니다.


단말
% rails g model post
마이그레이션 파일에 필요한 열을 추가합니다.이번에는 post _text입니다.이것은 (references형)에서 user를 인용하는 데 사용되는 키도 설명합니다.
db/migrate/xxxxxxxxxxxxx_create_posts.rb
class CreatePosts < ActiveRecord::Migration[6.0]
  def change
    create_table :posts do |t|
      t.string :post_text,        null: false
      t.references :user,         foreign_key: true 
      t.timestamps
    end
  end
end
데이터베이스에post표가 존재하는지 확인하기 위해 이전을 실행합니다.
단말
% rails db:migrate

연관 설명


후기와 사용자 모델에서 연관을 설명합니다.
models/post.rb
class Post < ApplicationRecord
  belongs_to :user
end
model/user.rb
class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

         has_many :posts, dependent: :destroy

end

활성 문자열 배포


Gemfile에서 Gem을 설명하고 설치합니다.
Gemfile
gem 'mini_magick'
gem 'image_processing', '~> 1.2'
단말
% bundle install
그런 다음 활성 Strage를 설치하고 마이그레이션을 수행합니다.
단말
rails active_storage:install
단말
rails db:migrate
post모델에서image열과의 관련을 설명합니다.
models/post.rb
class Post < ApplicationRecord
  belongs_to :user
  has_one_attached :image
end

설정 확인


마지막으로 투고 기능에 맞는 검증을 설정합니다.이번에는 투고 내용의post_텍스트와 이미지가 모두 필요합니다.따라서 양자의 검증을 설정한다.
여러 가지 조건이 있어 구김이 잘 가지 않을 때 다음과 같이 표로 정리하면 오류를 없앨 수 있다.

조건


열명
필수
post_text

image

검증


model/post.rb
class Post < ApplicationRecord
  belongs_to :user
  has_one_attached :image

  validates :post_text, presence: true
  validates :image, presence: true
end

작업 및 라우팅 설정


게시물 기능을 설정하고 필요한 작업 및 라우팅을 표시합니다.투고이기 때문에 new와create의 동작을 설정합니다.
빨대 파라미터도 설명했다.post_텍스트와 이미지를 허용합니다.
controller/post_controller.rb
class PostsController < ApplicationController

  def index
    @posts = Post.all
  end

  def new
    @post = Post.new 
  end

  def create
    @post = Post.new(post_params)
    if @post.save             #もしセーブしたら
      redirect_to root_path   #root_pathに戻る
    else                      #それ以外なら
      render :new             #newのページに戻るよ
    end
  end

 private
#ストロングパラメーター↓
  def post_params
    params.require(:post).permit(:post_text, :image).merge(user_id: current_user.id)
  end
#ストロングパラメーター↑
end
config/routes.rb
Rails.application.routes.draw do
  devise_for :users
  get 'posts/index'
  root to:'posts#index'
  resources :posts           #post全てのルーティングを設定
end

뷰 파일 설치


마지막으로 새 투고 화면에 필요한 보기를 설정합니다.완성 보기는 다음 사진입니다.
이렇게 실제 투고하면 데이터베이스에 반영돼 홈페이지로 돌아간다.

view/posts/new.html.erb
<h1 class="post_new_title">新規post</h1>

<%= form_with(model: @post, local: true) do |f| %>

  <div class="field">
    <%= f.label :post_text, "投稿内容" %><br />
    <%= f.text_field :post_text %>
  </div>

  <div class="field">
    <%= f.label :image, "画像" %><br />
    <%= f.file_field :image %>
  </div>

  <div class="actions">
    <%= f.submit "保存する", class: :form__btn  %>
  </div>

<% end %>
</div>

훑어보다


투고 내용을 한눈에 보기 위해 each 문장을 사용합니다.

view/index.html.erb
<% @posts.each do |post| %>
 <%= link_to image_tag(post.image), post_path(post.id) %>
 <%= link_to post.post_text, post_path(post.id) %>
 <%= link_to "by#{post.user.last_name}", root_path(post.user.id) %>
<% end %>

좋은 웹페이지 즐겨찾기