[Ruby on Rails] Posting-Funktion, die nur angemeldete Benutzer posten können

Ziel

post.gif

Entwicklungsumgebung

ruby 2.5.7 Rails 5.2.4.3 OS: macOS Catalina

Annahme

Erstellen einer Namensanmeldeumgebung mit Gerät Der Controller-Name lautet post (diesmal nur die post-Funktion)

1. Erstellen einer Tabelle

Post-Modell hinzufügen

Terminal


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

Bei der Ausführung wird wie folgt vorgegangen, eine Spalte wird hinzugefügt und kann gespeichert werden.

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

Supplement t.references: user, Foreign_key: true ist der externe Schlüssel des Benutzers. Informationen zu externen Schlüsseln finden Sie hier (https://qiita.com/kamillle/items/5ca2db470f199c1bc3ef).

Terminal


$ rails db:migrate

Modell bearbeiten

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: :zerstören ← Hier hinzufügen
end
Erläuterung Je nach Benutzer: Referenzen beim Erstellen des Controllers Auf der Post-Seite wird Gehört zu: Benutzer beschrieben, und 1 Post 1 Post kann speichern, wer den Post hat. Durch Hinzufügen von has_many: posts, abhängige :: zerstören auf der Benutzerseite Sie können eine Eins-zu-Viele-Beziehung erstellen und ein Benutzer kann viele Beiträge veröffentlichen.

2. Erstellung des Controllers

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)  #Geben Sie an, was neu gespeichert werden soll
  	@post.user_id = current_user.id  #Geben Sie an, wer gepostet hat
  	if @post.save  #Wenn Sie speichern können
   	 redirect_to new_post_path  #Übergang zum Buchungsbildschirm
  	else  #Wenn du nicht kannst
   	 render :new  #Übergang zu neu
  	end
  end

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

  private  #Starker Parameter (eine Funktion, um Schwachstellen zu verhindern, die unerwartete Werte ändern)
  def post_params
   params.require(:post).permit(:title, :body)  #Titel- und Textänderungen zulassen
  end
end

Supplement Durch Schreiben von before_action: authenticate_user! Selbst wenn Sie die URL eingeben, können Sie die Aktion new / create nicht ausführen, es sei denn, Sie sind angemeldet. Machen Sie einen Übergang zum Anmeldebildschirm.

Geändert wie unten.

config/routes.rb


  get 'posts/create'← Löschen
  get 'posts/new'← Löschen
  resources :posts, only: [:create, :new]← Hinzufügen

↓ Nach dem Wechsel

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]← Hinzufügen
end
Supplement resources ist eine RESTful-URL, und Beschreibungen wie get und patch können weggelassen werden.

3. Änderungen an Ansichten

Klicken Sie mit der rechten Maustaste und löschen Sie app / views / posts / create.html.erb.

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


<h1>Posts#new</h1>
<span>Derzeit angemeldeter Benutzer:<%= current_user.name %></span>![Bildschirmaufnahme 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 :Titel%><br>
		<%= f.text_field :title, autofocus: true %>
	</div>
	<div>
		<%= f.label :Inhalt%><br>
		<%= f.text_area :body %>
	</div>
	<div><%= f.submit "Post" %></div>
<% end %>


<table>
	<thead>
		<tr>
			<th>Gepostet mit Namen</th>
			<th>Titel</th>
			<th>Text</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>
Supplement Post-Funktion mit form_for-Helfer, Post-Inhaltserfassung mit jeder Methode.

Recommended Posts