[Rails] 로그인 후 투고

10848 단어 RubyRails
사용자로그인 후의 발언에 대한 노트입니다.
로그인한 사용자를 통해 투고한 글의 이미지를 가져옵니다.
또 모델은 한 쌍이 많다.
여기 기사를 참고하세요.
https://qiita.com/kazukimatsumoto/items/14bdff681ec5ddac26d1
사용자에게 투고하다.

전체 이미지


모델


Microsoft(출시)
content:string user:references
사용자
name:string amail:string password_digest:string

컨트롤러


마이크로 컨트롤러
toppages 컨트롤러


microposts
- 없음(create 및 destroy 기능만 해당)
toppages
-index(일람화면에 발언 내용의 표시, 발언 형식, 발언의 삭제 기능을 설치함)

모델 생성하기


위 열에 Micropost 및 User 모델을 생성합니다.
app/models/micropost.rb
class Micropost < ApplicationRecord
  belongs_to :user
end
그렇다면 나는 이렇게 쓴 것 같다.
belongs_to :user
하나의 User가 여러 개의 Micropost를 발표하는 상황에서 Micropost는 하나의 User와 관련이 있다는 것을 말합니다!이렇게 하면 포착할 수 있다.
예를 들면, "이 투고는 누가 쓴 것입니까?"이 경우 Micropost를 통해 User를 얻을 수 있습니다.
User 모델 봐봐.
app/models/user.rb
class User < ApplicationRecord
  has_many :microposts
end
이쪽
has_many :microposts
하나의 User가 여러 개의 Micropost를 발표하는 상황에서 User는 여러 개의 Micropost와 관련이 있습니다!으로 이해할 수 있다.
예를 들어 "누가 투고했습니까?"이 경우 User를 통해 Micropost를 얻을 수 있습니다.마이크로포스트는'많음'이기 때문에 복수 형식이다.

라우터


이제 라우터를 살펴보겠습니다.
config/routes.rbs
Rails.application.routes.draw do
  root to: 'toppages#index'

  resources :users, only: [:index, :show, :new, :create]

  resources :microposts, only: [:create, :destroy]
end

이것은 투고(Microsoft) 기능에서 사용하는 루트 정보다.
투고의 표시와 투고 화면은 투고 기능에 들어가지 않고 투고 기능은create와destory만 있다.

컨트롤러 및 뷰


첫 페이지


app/controllers/toppages_controller.rb
class ToppagesController < ApplicationController
  def index
    if logged_in?
      @micropost = current_user.microposts.build  
      @microposts = current_user.microposts.order('created_at DESC').page(params[:page])
    end
  end
end
첫 페이지에 발언 목록을 만들고 표시합니다.
@micropost = current_user.microposts.build
발언 기능에 사용되는 코드입니다.current_사용자는 rails에서 제공하는 방법을 사용하여 현재 로그인한 사용자를 얻습니다.
microposts.build은 모델이 정의한 마이크로posts를build (새로 만들기) 로 한다는 뜻입니다.
따라서 @micropost는 현재 로그인 중인 사용자가 마이크로포스터를 새로 만들기 위해 만든 상자를 말한다.
그 밖에
@microposts = current_user.microposts.order('created_at DESC').page(params[:page])
발언 목록이 작성되었습니다.제작된 마이크로포스터는order('create at DESC')의 제작 날짜와 시간 순서에 따라 배열되며 페이지(param[:page]) 페이지 기능(kaminari)이 첨부되어 있습니다.
그럼 첫 페이지를 볼게요.
app/views/toppages/index.html.erb

<% if logged_in? %>

  <%= form_for(@micropost) do |f| %>
    <div class="form-group">
      <%= f.text_area :content, class: 'form-control', rows: 5 %>
    </div>
    <%= f.submit 'Post', class: 'btn btn-primary btn-block' %>
  <% end %>
  <p>
  <P>投稿内容</p>
  <% @microposts.each do |micropost| %>
    <div>
      <%= link_to micropost.user.name, user_path(micropost.user) %> <span class="text-muted">posted at <%= micropost.created_at %></span>
    </div>
    <div>
      <p><%= micropost.content %></p>
    </div>
  <% end %>

<% end %>

로그인 후 첫 페이지를 열면 발언 형식과 발언 내용이 표시됩니다.

소박하지만 첫 페이지는 이런 화면으로 예정돼 있다.
(발언 기능이 설치되어 있지 않아 발언 내용이 표시되지 않아도 괜찮다.)

투고 기능


투고 기능을 살펴봅시다!
컨트롤러부터 봐.
마이크로포스터라는 이름으로 컨트롤러를 만들다.투고 기능에서 사용하는 동작은create와destroy뿐입니다.
app/controllers/microposts_controller.rb
class MicropostsController < ApplicationController
  before_action :correct_user, only: [:destroy]

  def create
    @micropost = current_user.microposts.build(micropost_params)
    if @micropost.save
      flash[:success] = 'メッセージを投稿しました。'
      redirect_to root_url
    else
      @microposts = current_user.microposts.order('created_at DESC').page(params[:page])
      flash.now[:danger] = 'メッセージの投稿に失敗しました。'
      render 'toppages/index'
    end
  end

  def destroy
    @micropost.destroy
    flash[:success] = 'メッセージを削除しました。'
    redirect_back(fallback_location: root_path)
  end

  private

  def micropost_params
    params.require(:micropost).permit(:content)
  end

  def correct_user
    @micropost = current_user.microposts.find_by(id: params[:id])
    unless @micropost
      redirect_to root_url
    end
  end
end
딱히 어려운 점은 없는 것 같아요.
투고할 때
def micropost_params
params.require(:micropost).permit(:content)
end
를 참고하십시오.
또한, 삭제 시
before_action :correct_user, only: [:destroy]

def correct_user
@micropost = current_user.microposts.find_by(id: params[:id])
unless @micropost
redirect_to root_url
end
end
구문을 사용합니다.
그럼 첫 페이지에 삭제 버튼을 붙여 보세요.
app/views/toppages/index.html.erb
<% if logged_in? %>

  <%= form_for(@micropost) do |f| %>
    <div class="form-group">
      <%= f.text_area :content, class: 'form-control', rows: 5 %>
    </div>
    <%= f.submit 'Post', class: 'btn btn-primary btn-block' %>
  <% end %>
  <p>
  <P>投稿内容</p>
  <% @microposts.each do |micropost| %>
    <div>
      <%= link_to micropost.user.name, user_path(micropost.user) %> <span class="text-muted">posted at <%= micropost.created_at %></span>
    </div>
    <div>
      <p><%= micropost.content %></p>
    </div>
    <div>
    <% if current_user == micropost.user %>
      <%= link_to "Delete", micropost, method: :delete, data: { confirm: "You sure?" }, class: 'btn btn-danger btn-xs' %>
    <% end %>
  </div>
  <% end %>

<% end %>
투고와 삭제 모두 가능합니다!

총결산


current_사용자로 로그인 중인 사용자와 투고 기능을 연결할 수 있습니다!
rails miso 부분인가요?
다음은 다대다기능에 대한 투고입니다. 가능하면 읽어주세요!!

좋은 웹페이지 즐겨찾기