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.
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
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, 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.
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
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.
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>
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/
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.
7,0 Stunden vom 07.11. Bis 14.11.