2017-10-19 5 views
0

Donc j'essaye de recréer le contrôle de version de GitHub pour les messages. J'ai trouvé un moyen de recréer un message original en utilisant le doublon ET une autre méthode pour créer un nouveau message basé sur l'original. Cool.Comment comparer deux éléments dans Ruby on Rails?

Mon problème est d'être en mesure d'afficher à la fois l'original et le nouveau sur la même page.

Ce que j'ai essayé jusqu'ici est de compter uniquement sur la méthode show d'avoir:

def show 
@post = Post.find(params[:id]) 
end 

Puis dans la vue ont sous la forme d'une case à cocher pour permettre à un utilisateur de sélectionner plusieurs messages, cliquez sur un soumettre, et une nouvelle page affiche affichant les deux côte à côte. De préférence montrant les différences entre les deux, mais c'est une liste de souhaits que je traite de ce premier.

En fait, ce que je pourrais simplement faire ?:

def other_show 
@post = Post.where(params[:id]) 
end 

J'ai également ajouté dans le statut de booléen pour aider à la vue pour marquer la case à cocher. Aurais-je besoin de mettre quelque chose dans la méthode other_show à propos de l'état?

+0

Je ne comprends pas tout à fait ce que vous voulez accomplir. Mais si vous voulez deux messages sur une page, créez '@ var's pour les deux' Post's dans la méthode 'show' et mettez-les côte à côte dans la vue. –

+0

En fait, c'est ce que je veux vraiment, c'est de voir les deux messages sur la même page. Idéalement, en voyant les différences entre eux. Vais-je faire deux vars dans le spectacle comme: old_post = Post.find (params [: id]) et puis new_post = Post.where (params [: id])? – Jake

+0

Dans ce cas, vous aurez 2 messages identiques. Votre route 'show' ressemble à'/posts /: id', donc le contrôleur aura '': id', mais si vous voulez trouver un autre message et le comparer avec l'original, vous devez passer un autre param à router, par exemple. '/ posts /: id? compare_id =: autre_id' et dans la méthode show' @original = Post.find (params [: id]) 'et' @compared = Post.find (params [: compare_id]) ' –

Répondre

0

Pour afficher 2 entités différentes sur une seule page, vous devez donner posts_controller les deux id s.

Déclarez votre méthode show comme ceci:

def show 
    @original = Post.find(params[:id]) 
    @compared = Post.find(params[:compared_id]) 
end 

bonne route à cette méthode ressemblera à ceci:

/posts/:id?compared_id=:another_id 
# Example: /posts/1?compared_id=2 

Pour construire un tel lien à votre avis, vous devez déclarer link_to méthode comme ceci:

<%= link_to '1 <> 2', post_path(@post, compared_id: '2') %> 

Si vous voulez Pour avoir une page où l'utilisateur peut cocher 2 cases à cocher pour certains articles, vous devez construire un tel href via Javascript.

Mais en fait, je ne vous suggérerais pas de modifier la méthode show pour une telle tâche. Il est préférable d'utiliser la méthode show uniquement pour afficher une entité de la base de données. Vous pouvez créer une autre méthode, par ex. compare et passez les deux paramètres ici.

def compare 
    @original = Post.find(params[:original_id]) 
    @compared = Post.find(params[:compared_id]) 
end 

Dans routes.rb

resources :posts do 
    get 'compare', on: :collection 
end 

Il vous donnera aide compare_posts_path, ce qui conduira à /posts/compare et vous aurez besoin de passer original_id et compared_id à lui, comme ceci:

<%= link_to 'Compare', compare_posts_path(original_id: 'some_id', compared_id: 'some_another_id') %> 

Il en résultera

/posts/compare?original_id=some_id&compared_id=some_another_id 
1

Si vous voulez "recréer" une sorte de contrôle de version, je vous suggère d'utiliser quelque chose comme audited. Au lieu de construire le vôtre. D'après votre exemple et vos commentaires, il semble que vous n'ayez pas de relation claire entre toutes les publications (versions de) publications. À l'aide de cette gemme, chaque modification apportée au contenu de la publication (par exemple, si elle est correctement configurée) sera enregistrée en tant qu'audit.

Montrer les différences est un problème différent. Cela est généralement appelé diff et vous pouvez trouver des pierres précieuses qui le font pour vous, par exemple: diffy

+0

C'est incroyable et je voudrais avoir ces avant tout ce code que j'ai écrit. Je vous remercie! – Jake

+0

Rédaction de code devrait être le moins que vous faites, plus vous planifiez/recherche le moins de code que vous avez à écrire et moins de code qui peut casser. Bonne chance pour votre projet! – Leito

+1

J'apprends vite cela. Merci – Jake