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.
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
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é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.
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
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.
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>
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/
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.
7,0 heures du 11/7 au 14/11.
Recommended Posts