J'ai essayé de créer une fonction de message pour l'extension Rails Tutorial (Partie 2): Créer un écran à afficher

Il s'agit d'une continuation de la tâche de création d'une fonction de message dans le chapitre 14 du didacticiel Rails.

Le modèle a été fabriqué jusqu'à la dernière fois. Créez un écran à afficher.

Conçu Afficher les spécifications pour afficher DM

Créez un moyen d'afficher le DM. Lisez 13.2 "Affichage des micropostes" dans le didacticiel.

Au lieu de l'afficher en fonction de l'écran de l'utilisateur comme Micropost, nous l'afficherons sur une page séparée. Similaire à Twitter.

Faites une maquette. Puisqu'il y a plusieurs expéditeurs, reportez-vous à la Figure 14.5 comme une maquette montrant les expéditeurs.


DM(3) Image 1 Thomas Hobbes Lorem ipsum sent 1 day ago. Image 2 Sasha Smith Aussi pauvre, méchante, sent 2 days ago. Image 3 John Calvin Excepteur sint sent 3 days ago.

Previous 1 2 3 next


Maquette de page DM

Créer une vue pour afficher le DM

Générez un contrôleur pour créer un contrôleur et une vue.

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

Faites une vue. Reportez-vous aux listes 13.22 et 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>

Créer un contrôleur pour afficher DM

Créez un contrôleur pour afficher la nouvelle page DM. Lisez «12.1.1 Password Reset Controller» dans le didacticiel.

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
Requête HTTP URL Action Route nommée
GET /dms/new new new_dm_path
POST /dms create dms_path
GET /dms index dms_path
DELETE dms/ destroy dm_path

Routage RESTful

Lisez "10.3.1 Page Liste des utilisateurs" dans le didacticiel. Un lien a été ajouté à la liste "10.40: Mettre à jour le lien vers la page de la liste des utilisateurs". Ajoutez de la même manière.

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>

Affichez l'écran pour vérifier que le lien a été ajouté au menu.

dm1.png

Je vais créer un test de redirection si je ne suis pas connecté plus tard.

J'ai remarqué que la vue est affichée même si le contrôleur est index. Renommez le fichier. show.html.erb -> index.html.erb

app/controllers/dms_controller.rb


class DmsController < ApplicationController
  def index
  end
end

Afficher l'écran comme un essai

Affichons-le à l'écran avec le serveur rails. J'ai une erreur. Le message est undefined method `name' for nil:NilClass Alors, où l'erreur s'est produite <% provide(:title, @user.name)%> est. Je pense que @user est nul. Changez où définir l'utilisateur connecté pour @user en vous référant à l'écran d'affichage de l'utilisateur.

app/controllers/dms_controller.rb


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

Je vais l'afficher à l'écran. J'ai encore une erreur.

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

Où l'erreur s'est produite

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

est. Je pense que j'ai besoin de mettre des données dans @dms sur le contrôleur. Voyons comment afficher le micro-message sur l'écran d'accueil.

Avec le contrôleur

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

Et @feed_items.

En vue

python


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

Et @feed_items sont répertoriés par rendu. Je vais le changer pour référence.

app/controllers/dms_controller.rb


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

Dans Micropost, il semble bon de se référer au chapitre 13 qui fait bon usage de feed et feed_items. En relisant

render @user

Je n'étais pas sûr de ce que cela signifiait, alors je vais revenir en arrière et le relire. Au contrôleur

app/controllers/dms_controller.rb


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

Dans ce cas, en vue

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

Pensez à quoi écrire.

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>

Je vais essayer d'afficher l'écran sur le serveur de rails. Il n'y a qu'une seule page en raison de la faible quantité de données. Augmentez les données pour voir si pagnate est terminé. Utilisons Faker :: Hipster.sentence pour générer des données de test pour le contenu.

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

Montrons l'écran.

dm3.png

J'ai remarqué que le récepteur ne sort pas, donc je vais le changer de l'expéditeur.

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

Création de test d'affichage DM

Créez un test de l'écran qui affiche le DM. Reportez-vous à "13.2.3 Test du micropost sur l'écran de profil" dans le tutoriel.

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

Comme indiqué dans l'extrait 13.28, des symboles tels que "'" étaient affichés sous forme de caractères spéciaux, j'ai donc cherché sur le net pour savoir comment échapper et je l'ai corrigé. https://rakuda3desu.net/rakudas-rails-tutorial14-3/

Tester la création du contrôle d'accès du contrôleur

Faites un test pour le contrôleur. Lisez "13.3.1 Micropost Access Control" dans le didacticiel.

test/controllers/dms_controller_test.rb


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

C'est rouge. Ajoutez des restrictions d'accès pour l'action d'index au contrôleur.

app/controllers/dms_controller.rb


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

Le test est maintenant VERT.

Temps requis

7,0 heures du 11/7 au 14/11.

Recommended Posts

J'ai essayé de créer une fonction de message pour l'extension Rails Tutorial (Partie 2): Créer un écran à afficher
J'ai essayé de créer une fonction de message de l'extension Rails Tutorial (Partie 1): Créer un modèle
J'ai essayé de faire une fonction de réponse de l'extension Rails Tutorial (Partie 3): Correction d'un malentendu des spécifications
J'ai créé une fonction de réponse pour l'extension Rails Tutorial (Partie 1)
J'ai essayé de créer une fonction de groupe (babillard) avec Rails
J'ai créé une fonction de réponse pour l'extension Rails Tutorial (Partie 2): Changer de modèle
[Rails] Implémentation de la fonction de catégorie multicouche en utilisant l'ascendance "J'ai essayé de créer une fenêtre avec Bootstrap 3"
J'ai essayé de créer une fonction de connexion avec Java
J'ai essayé de créer une fonction / écran d'administrateur de site commercial avec Java et Spring
Tutoriel pour créer un blog avec Rails pour les débutants Partie 1
[Rails] J'ai essayé de créer une mini application avec FullCalendar
Tutoriel pour créer un blog avec Rails pour les débutants Partie 2
J'ai créé un client RESAS-API en Java
Tutoriel pour créer un blog avec Rails pour les débutants Partie 0
J'ai créé une fonction de réponse pour l'extension Rails Tutorial (Partie 4): une fonction qui rend l'utilisateur unique
J'ai essayé d'implémenter le traitement Ajax de la fonction similaire dans Rails
J'ai créé une application d'apprentissage automatique avec Dash (+ Docker) part2 ~ Façon basique d'écrire Dash ~
J'ai essayé de créer une classe parent d'objet de valeur dans Ruby
J'ai essayé de créer une application de clonage LINE
[Première construction d'environnement] J'ai essayé de créer un environnement Rails6 + MySQL8.0 + Docker sur Windows 10.
J'ai essayé d'implémenter une fonction équivalente à Felica Lite avec HCE-F d'Android
Rails6 Je veux créer un tableau de valeurs avec une case à cocher
[Android] J'ai créé un écran de liste de matériaux avec ListView + Bottom Sheet
J'ai essayé de créer une compétence Clova en Java
Je souhaite définir une fonction dans la console Rails
[Rails] Je souhaite afficher la destination du lien de link_to dans un onglet séparé
J'ai essayé de créer un environnement de développement java8 avec Chocolatey
Je souhaite implémenter une fonction d'édition des informations produit ~ part1 ~
Je souhaite créer un modèle spécifique d'ActiveRecord ReadOnly
J'ai essayé de convertir l'exemple d'application en microservice selon l'idée du livre "Microservice Architecture".
Je veux créer une fonction avec kotlin et java!
Je souhaite créer un formulaire pour sélectionner la catégorie [Rails]
Une série d'étapes pour créer des livrables pour les portefeuilles avec Rails
[Rails 6.0, Docker] J'ai essayé de résumer la construction de l'environnement Docker et les commandes nécessaires pour créer un portfolio
J'ai essayé de créer un environnement de développement padrino avec Docker
J'ai essayé de créer une application cartographique simple dans Android Studio
Je souhaite ajouter une fonction de navigation avec ruby on rails
[Rails 6] Comment créer un écran de saisie de formulaire dynamique à l'aide de cocoon
J'ai essayé d'implémenter la fonction de prévisualisation d'image avec Rails / jQuery
J'ai essayé de créer un environnement de développement Spring MVC sur Mac
[Unity] J'ai essayé de créer un plug-in natif UniNWPathMonitor en utilisant NWPathMonitor
J'ai essayé de créer une application simple en utilisant Dockder + Rails Scaffold
[Java] J'ai essayé de faire un labyrinthe par la méthode de creusage ♪
(Ruby on Rails6) Créer une fonction pour modifier le contenu publié
Préparation à la création de l'application Rails
[Tutoriel Rails Chapitre 5] Créer une mise en page
Comment créer un écran de démarrage
En utilisant la fonction de détection de visage de Watson Visual Recognition, j'ai essayé de transformer une image corporelle entière d'une personne en une image de la partie du visage uniquement.
J'ai essayé de créer une application d'apprentissage automatique avec Dash (+ Docker) part1 ~ Construction de l'environnement et vérification du fonctionnement ~
J'ai essayé de créer un exemple de programme en utilisant le problème du spécialiste des bases de données dans la conception pilotée par domaine