Il s'agit d'une continuation de la création d'une fonction de réponse dans le chapitre 14 du didacticiel Rails.
Lorsqu'un micropost avec @reply écrit est posté, une fonction pour mettre un identifiant dans in_reply_to du modèle faire.
La seule chose à changer est de recevoir le message et de sauvegarder le modèle. Découvrez où il se trouve.
Recherchez sur le net des méthodes qui fonctionnent sur des chaînes. https://www.sejuku.net/blog/11843 start_with? (Vérifiez s'il commence par la chaîne de caractères spécifiée) http://rubytips86.hatenablog.com/entry/2014/03/28/132953 Lis.
En creusant dans les fonctionnalités, j'ai réalisé que c'était une erreur de penser que le contenu commençait par @reply. 「@reply exampleuser hogehoge...」 Je pensais que c'était, mais ça devrait être correct 「@exampleuser hogehoge...」 était.
Cela étant dit, si le nom contient des blancs, vous savez que vous avez un problème. Par exemple, j'ai eu l'idée que même si le nom est "Ola Lakin I" et que vous l'affichez comme "@Ola Lakin I", vous ne pouvez trouver que le nom "@Ola".
Une solution possible consiste à ajouter un identifiant unique. En fait, j'ai dit la même chose dans le texte, mais à ce stade, j'ai finalement eu une pincée.
Je vais réfléchir à la façon de rendre ce qui suit unique car le texte décrit également la méthode spécifique. Pour le moment, nous supposerons que @name est unique et n'inclut pas les espaces. Après avoir créé la fonctionnalité sur cette hypothèse, nous apporterons des modifications uniques.
Essayez la méthode que vous avez recherchée sur le net sur la console.
>> s = "@Example hoge hoge aa"
=> "@Example hoge hoge aa"
>> b = s.scan(/@\w+/)
=> ["@Example"]
Découvrez ce qui se passe lorsque la chaîne ne contient pas @xx.
>> s2 = "Example hoge hoge aa"
=> "Example hoge hoge aa"
>> b2 = s2.scan(/@\w+/)
=> []
>> b2[0]
=> nil
C'est devenu nul.
Ensuite, essayez de supprimer le @.
>> b = s.scan(/@\w+/)
=> ["@Example"]
>> b[0].slice!(0)
=> "@"
>> b[0]
=> "Example"
Vous pouvez maintenant récupérer le mot @xxx.
Pensez que l'écran n'a pas besoin d'être changé et regardez le texte où changer le contrôleur. Je crée dans controllers / microposts_controller.rb.
controllers/microposts_controller.rb
def create
@micropost = current_user.microposts.build(micropost_params)
#Vérifier la réponse
if reply_id = @micropost.content.scan(/@\w+/)
@micropost.in_reply_to = reply_id[0].slice![0]
end
if @micropost.save
flash[:succsess] = "Micropost created!"
redirect_to root_url
else
@feed_items = []
render 'static_pages/home'
end
end
Puisque nous allons changer le contrôleur, écrivez d'abord test. L'élément de test est que la création d'un micro-message de réponse augmentera le nombre de destinataires d'un. En fonction de l'endroit où vous écrivez le test, réfléchissez à la façon de le séparer du test d'intégration.
Relisez le tutoriel pour un exemple de test de contrôleur. Dans les micro-messages des chapitres 13 et 14, le test d'intégration a été réalisé après le test du modèle. Dans 13.3.1, le contenu du test du contrôleur était de tester si vous êtes connecté.
Regardons en fait la source du test. Sous le dossier des contrôleurs. Les deux étaient des tests pour voir si vous étiez connecté et affichez la bonne page. Nous avons constaté que le test d'intégration était bon pour vérifier les résultats traités.
Écrivons un test d'intégration.
test/integration/reply_test.rb RED
test "reply to user " do
log_in_as(@user)
content = "@#{@other.name} reply test content"
post microposts_path, params: { micropost: {content: content }}
log_in_as(@other)
get root_path
assert_not @other.following?(@user)
assert_match content, response.body
end
Lorsque j'ai exécuté le test, j'ai eu une erreur avec les données de l'appareil.
ERROR["test_reply_to_user_", ReplyTest, 0.3831760289999693]
test_reply_to_user_#ReplyTest (0.38s)
NoMethodError: NoMethodError: undefined method `id' for nil:NilClass
test/fixtures/microposts.yml:54:in `get_binding'
Il semble introuvable. Si vous regardez sur le net, cela dépend de l'ordre dans lequel les appareils sont appelés, et s'il y a des restrictions externes Cela semble gênant.
Au lieu de créer des données de test avec un appareil, essayez de publier dans le test du modèle.
En passant, je corrigerai le malentendu de la spécification de @ reply lorsque j'ai fait le projecteur auparavant.
test/models/user_test.rb
test "feed should have the reply posts" do
michael = users(:michael)
malory = users(:malory)
assert_not malory.following?(michael)
reply_post = michael.microposts.create!(content: "@malory reply test",
in_reply_to: malory.id)
assert michael.feed.include?(reply_post)
assert malory.feed.include?(reply_post)
end
Le test est maintenant réussi.
Changez de contrôleur.
controllers/microposts_controller.rb
def create
@micropost = current_user.microposts.build(micropost_params)
#Vérifier la réponse
if reply_id = @micropost.content.scan(/@\w+/)[0]
reply_id.slice!(0)
@micropost.in_reply_to = User.find_by(name: reply_id)
end
if @micropost.save
flash[:succsess] = "Micropost created!"
redirect_to root_url
else
@feed_items = []
render 'static_pages/home'
end
end
Corrigez les données de test. Créez un utilisateur sans espace entre le prénom et le nom.
test/fixtures/users.yml
Bob:
name: Bob
email: [email protected]
password_digest: <%= User.digest('password') %>
activated: true
activated_at: <%= Time.zone.now %>
Le test est toujours rouge, donc quand j'ai débogué avec des put, j'ai trouvé une erreur et je l'ai corrigée. J'avais besoin d'une pièce d'identité.
Avant modification @ micropost.in_reply_to = User.find_by (nom: reply_id) Après modification @ micropost.in_reply_to = User.find_by (nom: reply_id) .id
controllers/microposts_controller.rb
def create
@micropost = current_user.microposts.build(micropost_params)
#Vérifier la réponse
if reply_id = @micropost.content.scan(/@\w+/)[0]
reply_id.slice!(0)
@micropost.in_reply_to = User.find_by(name: reply_id).id
end
if @micropost.save
flash[:succsess] = "Micropost created!"
redirect_to root_url
else
@feed_items = []
render 'static_pages/home'
end
end
Le test est maintenant VERT.
Testons-le à l'écran. J'ai créé un utilisateur sans espace et j'ai confirmé que cela fonctionne.
2,5 heures du 10/11 au 10/17.
Recommended Posts