Ich habe versucht, eine Nachrichtenfunktion für die Erweiterung Rails Tutorial (Teil 2) zu erstellen: Erstellen Sie einen Bildschirm zum Anzeigen

Dies ist eine Fortsetzung der Aufgabe zum Erstellen einer Nachrichtenfunktion in Kapitel 14 des Rails-Lernprogramms.

Das Modell wurde bis zum letzten Mal gemacht. Erstellen Sie einen Bildschirm zur Anzeige.

Entwickelte Ansichtsspezifikationen zur Anzeige von DM

Erstellen Sie eine Möglichkeit, DM anzuzeigen. Lesen Sie 13.2 "Anzeigen von Mikroposts" im Tutorial.

Anstatt es wie Micropost auf dem Bildschirm des Benutzers anzuzeigen, wird es auf einer separaten Seite angezeigt. Ähnlich wie bei Twitter.

Machen Sie ein Modell. Da es mehrere Absender gibt, finden Sie in Abbildung 14.5 ein Modell, das die Absender zeigt.


DM(3) Bild 1 Thomas Hobbes Lorem ipsum sent 1 day ago. Bild 2 Sasha Smith Auch arm, böse, sent 2 days ago. Bild 3 John Calvin Excepteur sint sent 3 days ago.

Previous 1 2 3 next


Abbildung DM-Seitenmodell

Erstellen Sie eine Ansicht, um DM anzuzeigen

Generieren Sie einen Controller, um einen Controller und eine Ansicht zu erstellen.

ubuntu:~/environment/sample_app (create-dm) $ rails generate controller Dms

Machen Sie eine Ansicht. Siehe Listings 13.22 und 13.24.

ruby:app/views/dms/show.html.erb


<% provide(:title, @user.name)%>
<div class="row">
  <div class="col-md-8">
    <% if @user.send_dms.any? %>
      <h3>DMs (<%= @user.sent_dms.count %>)</h3>
      <ol class="dms">
        <li id="dm-<%= dm.id %>">
          <%= link_to gravatar_for(dm.sender, size: 50), dm.sender %>
          <span class="user"><%= link_to dm.sender.name, dm.sender%></span>
          <span class="content"><%= dm.content %></span>
          <span class="timestamp">
            Sent <%= time_ago_in_words(dm.created_at) %> ago.
          </span>
        </li>
      </ol>
    <% end %>  
  </div>
</div>

Erstellen Sie einen Controller zur Anzeige von DM

Erstellen Sie einen Controller, um die neue DM-Seite anzuzeigen. Lesen Sie im Tutorial "12.1.1 Controller zum Zurücksetzen des Kennworts".

config/routes.rb


Rails.application.routes.draw do
  root 'static_pages#home'
  get  '/help',    to: 'static_pages#help'
  get  '/about',   to: 'static_pages#about'
  get  '/contact', to: 'static_pages#contact'
  get  '/signup',  to: 'users#new'
  post '/signup',  to: 'users#create'
  get  '/login',   to: 'sessions#new'
  post '/login',   to: 'sessions#create'
  delete '/logout', to: 'sessions#destroy'
  resources :users do
    member do
      get :following, :followers
    end
  end
    resources :account_activations, only: [:edit]
  resources :password_resets,     only: [:new, :create, :edit, :update]
  resources :microposts,          only: [:create, :destroy]
  resources :relationships,       only: [:create, :destroy]
  resources :dms,                 only: [:new, :create, :index, :destroy]
end
HTTP-Anfrage URL Action Benannte Route
GET /dms/new new new_dm_path
POST /dms create dms_path
GET /dms index dms_path
DELETE dms/ destroy dm_path

RESTful Routing

Lesen Sie "10.3.1 Benutzerlistenseite" im Tutorial. Der Liste "10.40: Link zur Benutzerlistenseite aktualisieren" wurde ein Link hinzugefügt. Auf die gleiche Weise hinzufügen.

ruby:views/layouts/_header.html.erb


                <ul class="dropdown-menu">
                  <li><%= link_to "Profile", current_user %></li>
                  <li><%= link_to "Settings", edit_user_path(current_user) %></li>
                  <li><%= link_to "DM", dms_path %></li>

Zeigen Sie den Bildschirm an, um zu überprüfen, ob der Link zum Menü hinzugefügt wurde.

dm1.png

Ich erstelle einen Test für die Umleitung, wenn ich später nicht angemeldet bin.

Ich habe festgestellt, dass die Ansicht angezeigt wird, obwohl der Controller ein Index ist. Benennen Sie die Datei um. show.html.erb -> index.html.erb

app/controllers/dms_controller.rb


class DmsController < ApplicationController
  def index
  end
end

Zeigen Sie den Bildschirm als Test an

Lassen Sie es uns mit Rails Server auf dem Bildschirm anzeigen. Ich habe einen Fehler bekommen. Die Nachricht ist undefined method `name' for nil:NilClass Also, wo der Fehler aufgetreten ist <% provide(:title, @user.name)%> ist. Ich denke, @user ist gleich Null. Um @user festzulegen, wo Sie sich anmelden möchten, lesen Sie den Anzeigebildschirm des Benutzers und ändern Sie ihn auf die gleiche Weise.

app/controllers/dms_controller.rb


class DmsController < ApplicationController
  def index
      @user = current_user
  end
end

Ich werde es auf dem Bildschirm anzeigen. Ich habe wieder einen Fehler bekommen.

undefined local variable or method `dm' for #<#<Class:0x00005575f57bf2a8>:0x00005575f57deb58>

Wo der Fehler aufgetreten ist

  <li id="dm-<%= dm.id %>">

ist. Ich denke, ich muss Daten in @dms auf dem Controller speichern. Mal sehen, wie der Mikropost auf dem Startbildschirm angezeigt wird.

Mit dem Controller

      @micropost  = current_user.microposts.build
      @feed_items = current_user.feed.paginate(page: params[:page])

Und @feed_items.

Im Hinblick auf

python


  <ol class="microposts">
    <%= render @feed_items%>
  </ol>

Und @feed_items werden nach Render aufgelistet. Ich werde es als Referenz ändern.

app/controllers/dms_controller.rb


  def index
      @user = current_user
      @dms = @user.sent_dms
  end

In Micropost scheint es gut zu sein, auf Kapitel 13 zu verweisen, in dem feed und feed_items gut genutzt werden. Beim Zurücklesen

render @user

Ich war mir nicht sicher, was das bedeutete, also gehe ich zurück und lese es zurück. Zum Controller

app/controllers/dms_controller.rb


  def index
      @user = current_user
      @dms = @user.sent_dms.paginate(page: params[:page])
  end

In diesem Fall im Blick

<span class="user"><%= link_to dm.sender.name, dm.sender%></span>

Überlegen Sie, was Sie schreiben möchten.

ruby:app/views/dms/index.html.erb


<% provide(:title, @user.name) %>
<h1>DM</h1>

<% if @user.sent_dms.any? %>
    <h3>DMs (<%= @user.sent_dms.count %>)</h3>
    <ol class= "microposts">
      <%= render @dms %>  
    </ol>
    <%= will_paginate @dms %>
<% end %>  

ruby:app/views/dms/_dm.html.erb


<li id="dm-<%= dm.id %>">
  <%= link_to gravatar_for(dm.sender, size: 50), dm.sender %>
  <span class="user"><%= link_to dm.sender.name, dm.sender%></span>
  <span class="content"><%= dm.content %></span>
  <span class="timestamp">
    Sent <%= time_ago_in_words(dm.created_at) %> ago.
  </span>
</li>

Ich werde versuchen, den Bildschirm auf dem Rails-Server anzuzeigen. Aufgrund der geringen Datenmenge gibt es nur eine Seite. Erhöhen Sie die Daten, um festzustellen, ob eine Pagnate erfolgt. Verwenden wir Faker :: Hipster.sentence, um Testdaten für Inhalte zu generieren.

db/seeds.rb


# DM
users = User.order(:created_at).take(6)
receiver = users.second
50.times do
  content = Faker::Hipster.sentence
  users.each {|user| user.sent_dms.create!(content: content,
                                           receiver_id: receiver.id) }
end

Lassen Sie uns den Bildschirm anzeigen.

dm3.png

Ich habe festgestellt, dass der Empfänger nicht herauskommt, daher werde ich ihn vom Absender aus ändern.

ruby:app/views/dms/_dm.html.erb


<li id="dm-<%= dm.id %>">
  <%= link_to gravatar_for(dm.receiver, size: 50), dm.receiver %>
  <span class="user"><%= link_to dm.receiver.name, dm.receiver%></span>

dm4.png

Erstellung eines DM-Anzeigetests

Erstellen Sie einen Test des Bildschirms, auf dem der DM angezeigt wird. Siehe "13.2.3 Testen des Mikroposts auf dem Profilbildschirm" im Lernprogramm.

test/fixtures/dms.yml


...
<% 30.times do |n| %>
dm_<%= n %>:
  content: <%= Faker::Hipster.sentence %>
  created_at* <%= 42.days.ago %>
  sender: michael
  receiver: archer
<% end %>

test/integration/dms_test.rb


class DmsTest < ActionDispatch::IntegrationTest

  def setup
    @user = users(:michael)
  end
  
  test "dm display" do
    log_in_as(@user)
    get dms_path
    assert_template 'dms/index'
    assert_select 'title', full_title(@user.name)
    assert_match @user.sent_dms.count.to_s, response.body
    assert_select 'div.pagination'
    @user.sent_dms.paginate(page: 1).each do |dm| 
      assert_match CGI.escapeHTML(dm.content), response.body
    end
  end

Wie in Listing 13.28 gezeigt, wurden Symbole wie "'" als Sonderzeichen ausgegeben. Deshalb habe ich im Netz nach Fluchtmöglichkeiten gesucht und diese korrigiert. https://rakuda3desu.net/rakudas-rails-tutorial14-3/

Testen Sie die Erstellung der Controller-Zugriffskontrolle

Machen Sie einen Test für die Steuerung. Lesen Sie "13.3.1 Micropost Access Control" im Tutorial.

test/controllers/dms_controller_test.rb


  test "should redirect index when not logged in" do
    get dms_path
    assert_redirected_to login_url
  end  

Es ist rot. Fügen Sie dem Controller Zugriffsbeschränkungen für die Indexaktion hinzu.

app/controllers/dms_controller.rb


class DmsController < ApplicationController
  before_action :logged_in_user, only: [:index]

Der Test ist jetzt GRÜN.

Benötigte Zeit

7,0 Stunden vom 07.11. Bis 14.11.

Recommended Posts

Ich habe versucht, eine Nachrichtenfunktion für die Erweiterung Rails Tutorial (Teil 2) zu erstellen: Erstellen Sie einen Bildschirm zum Anzeigen
Ich habe versucht, eine Nachrichtenfunktion der Rails Tutorial-Erweiterung (Teil 1) zu erstellen: Erstellen Sie ein Modell
Ich habe versucht, eine Antwortfunktion für die Rails Tutorial-Erweiterung (Teil 3) zu erstellen: Ein Missverständnis der Spezifikationen wurde behoben
Ich habe eine Antwortfunktion für die Rails Tutorial-Erweiterung (Teil 1) erstellt.
Ich habe versucht, mit Rails eine Gruppenfunktion (Bulletin Board) zu erstellen
Ich habe eine Antwortfunktion für die Rails Tutorial-Erweiterung (Teil 2) erstellt: Modell ändern
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der Abstammung "Ich habe versucht, ein Fenster mit Bootstrap 3 zu erstellen"
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
Ich habe versucht, mit Java und Spring eine Funktion / einen Bildschirm für den Administrator einer Einkaufsseite zu erstellen
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 1
[Rails] Ich habe versucht, eine Mini-App mit FullCalendar zu erstellen
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 2
Ich habe einen RESAS-API-Client in Java erstellt
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 0
Ich habe eine Antwortfunktion für die Erweiterung Rails Tutorial (Teil 4) erstellt: Eine Funktion, die den Benutzer einzigartig macht
Ich habe versucht, die Ajax-Verarbeitung der ähnlichen Funktion in Rails zu implementieren
Ich habe eine App für maschinelles Lernen mit Dash (+ Docker) Teil 2 ~ Grundlegende Schreibweise für Dash ~ erstellt
Ich habe versucht, ein übergeordnetes Wertklasseobjekt in Ruby zu erstellen
Ich habe versucht, eine LINE-Klon-App zu erstellen
[Erste Umgebungskonstruktion] Ich habe versucht, eine Rails6 + MySQL8.0 + Docker-Umgebung unter Windows 10 zu erstellen.
Ich habe versucht, mit HCE-F von Android eine Funktion zu implementieren, die Felica Lite entspricht
Rails6 Ich möchte ein Array von Werten mit einem Kontrollkästchen erstellen
[Android] Ich habe mit ListView + Bottom Sheet einen Materiallistenbildschirm erstellt
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
Ich möchte eine Funktion in der Rails Console definieren
[Rails] Ich möchte das Linkziel von link_to auf einer separaten Registerkarte anzeigen
Ich habe versucht, mit Chocolatey eine Java8-Entwicklungsumgebung zu erstellen
Ich möchte eine Produktinformationsbearbeitungsfunktion ~ part1 ~ implementieren
Ich möchte ein bestimmtes Modell von ActiveRecord ReadOnly erstellen
Ich habe versucht, die Beispielanwendung gemäß der Idee des Buches "Micro Service Architecture" in einen Mikrodienst zu verwandeln.
Ich möchte eine Funktion mit Kotlin und Java erstellen!
Ich möchte ein Formular erstellen, um die Kategorie [Schienen] auszuwählen
Eine Reihe von Schritten zum Erstellen von Ergebnissen für Portfolios mit Rails
[Rails 6.0, Docker] Ich habe versucht, die Konstruktion der Docker-Umgebung und die zum Erstellen eines Portfolios erforderlichen Befehle zusammenzufassen
Ich habe versucht, mit Docker eine Padrino-Entwicklungsumgebung zu erstellen
Ich habe versucht, eine einfache Karten-App in Android Studio zu erstellen
Ich möchte eine Browsing-Funktion mit Ruby on Rails hinzufügen
[Rails 6] So erstellen Sie mit cocoon einen dynamischen Formular-Eingabebildschirm
Ich habe versucht, die Bildvorschau mit Rails / jQuery zu implementieren
Ich habe versucht, eine Spring MVC-Entwicklungsumgebung auf einem Mac zu erstellen
[Unity] Ich habe mit NWPathMonitor ein natives Plug-In UniNWPathMonitor erstellt
Ich habe versucht, eine einfache Anwendung mit Dockder + Rails Scaffold zu erstellen
[Java] Ich habe versucht, mit der Grabmethode ein Labyrinth zu erstellen ♪
(Ruby on Rails6) Erstellen Sie eine Funktion zum Bearbeiten des veröffentlichten Inhalts
Vorbereiten der Erstellung einer Rails-Anwendung
[Rails Tutorial Kapitel 5] Erstellen Sie ein Layout
So erstellen Sie einen Begrüßungsbildschirm
Mit der Gesichtserkennungsfunktion von Watson Visual Recognition habe ich versucht, ein Ganzkörperbild einer Person in ein Bild nur des Gesichtsteils zu verarbeiten
Ich habe versucht, eine Anwendung für maschinelles Lernen mit Dash (+ Docker) Teil 1 ~ Umgebungskonstruktion und Funktionsprüfung ~ zu erstellen
Ich habe versucht, ein Beispielprogramm mit dem Problem des Datenbankspezialisten für domänengesteuertes Design zu erstellen