[Ruby on Rails] Fonction de publication que seuls les utilisateurs connectés peuvent publier

Cible

post.gif

Environnement de développement

ruby 2.5.7 Rails 5.2.4.3 OS: macOS Catalina

supposition

Création d'un environnement de connexion par nom avec un appareil Le nom du contrôleur est post (uniquement la fonction post cette fois)

1. Créer un tableau

Ajouter un modèle de publication

Terminal


$ rails g model Post user:references title:string body:string

Une fois exécuté, ce sera comme suit, une colonne sera ajoutée et elle pourra être enregistrée.

db/migrate/xxxxxxxxxxxxx_create_posts.rb


class CreatePosts < ActiveRecord::Migration[5.2]
  def change
    create_table :posts do |t|
      t.references :user, foreign_key: true
      t.string :title
      t.string :body

      t.timestamps
    end
  end
end

<détails>

Supplément </ summary> t.references: user, Foreign_key: true est la clé externe de l'utilisateur. Pour les clés externes, voir ici (https://qiita.com/kamillle/items/5ca2db470f199c1bc3ef). </ détails>

Terminal


$ rails db:migrate

Modifier le modèle

app/models/post.rb


class Post < ApplicationRecord
  belongs_to :user
end

app/models/user.rb


class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  has_many :posts, dependent: :détruire ← Ajouter ici
end

<détails> <résumé> Explication </ résumé> En fonction de l'utilisateur: références lors de la création du contrôleur Du côté de l'article, appartient_to: l'utilisateur est décrit, et 1 article 1 article peut enregistrer qui est l'article. En ajoutant has_many: posts, depend :: destroy du côté utilisateur Vous pouvez créer une relation un-à-plusieurs et un utilisateur peut publier plusieurs publications.

2. Création du contrôleur

Terminal


$ rails g controller posts create new

app/controllers/posts_controller.rb


class PostsController < ApplicationController
  before_action :authenticate_user!
  def create
  	@post = Post.new(post_params)  #Spécifiez ce que vous souhaitez enregistrer récemment
  	@post.user_id = current_user.id  #Précisez qui a publié
  	if @post.save  #Si vous pouvez économiser
   	 redirect_to new_post_path  #Transition vers l'écran de publication
  	else  #Si tu ne peux pas
   	 render :new  #Transition vers nouveau
  	end
  end

  def new
   @post = Post.new
   @posts = Post.all
  end

  private  #Paramètre fort (une fonction pour éviter les vulnérabilités qui modifient des valeurs inattendues)
  def post_params
   params.require(:post).permit(:title, :body)  #Autoriser les changements de titre et de corps
  end
end

<détails>

Supplément </ summary> En écrivant before_action: authenticate_user! Même si vous saisissez l'URL, vous ne pouvez pas exécuter l'action nouveau / créer tant que vous n'êtes pas connecté. Faites une transition vers l'écran de connexion. </ détails>

Modifié comme ci-dessous.

config/routes.rb


  get 'posts/create'← Supprimer
  get 'posts/new'← Supprimer
  resources :posts, only: [:create, :new]← Ajouter

↓ Après le changement

config/routes.rb


Rails.application.routes.draw do
  devise_for :users, controllers: {
    sessions: 'users/sessions',
    registrations: 'users/registrations',
  }
  root 'homes#top'
  get 'mypage', to: 'homes#mypage'
  resources :posts, only: [:create, :new]← Ajouter
end

<détails>

Supplément </ summary> resources est une URL RESTful et les descriptions telles que get et patch peuvent être omises. </ détails>

3. Modifications des vues

Cliquez avec le bouton droit de la souris et supprimez app / views / posts / create.html.erb.

erb:app/views/posts/new.html.erb


<h1>Posts#new</h1>
<span>Utilisateur actuellement connecté:<%= current_user.name %></span>![Enregistrement d'écran 2020-09-01 22.17.23.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700999/512682b6-24c4-0a5b-fc87-35fc7806c02f.gif)

<%= form_for(@post, url: posts_path) do |f| %>
	<div>
		<%= f.label :Titre%><br>
		<%= f.text_field :title, autofocus: true %>
	</div>
	<div>
		<%= f.label :Contenu%><br>
		<%= f.text_area :body %>
	</div>
	<div><%= f.submit "Publier" %></div>
<% end %>


<table>
	<thead>
		<tr>
			<th>Publié par nom</th>
			<th>Titre</th>
			<th>Texte</th>
		</tr>
	</thead>
	<tbody>
		<% @posts.each do |post| %>
			<tr>
				<td><%= post.user.name %></td>
				<td><%= post.title %></td>
				<td><%= post.body %></td>
			</tr>
		<% end %>
	</tbody>
</table>

<détails>

Supplément </ summary> Post fonction avec form_for helper, post acquisition de contenu avec chaque méthode. </ détails>

Recommended Posts