2017-01-22 1 views
0

J'essaie de créer un lien vers une page qui affichera les meilleures réponses pour chaque message, mais quand je configure tout et cliquez sur le bouton link_to j'obtiens le message d'erreur:Impossible de trouver Message avec 'id' =

ActiveRecord :: RecordNotFound (Impossible de trouver après avec 'id' =):

je dans mes vues:

<% if @post.user == current_user && @post.responses.where(top: true).size >= 1 %> 
     <a href="#" class="btt"><%= link_to "finalize top", '/top' %>Finalize Top</a> 

Et j'ai mon/set top de la route pour afficher les meilleures réponses page:

get '/top' => 'responses#top' 

Je comprends que Rails ne sait pas quel poste je parle, mais je ne sais pas ce qui doit changer dans les vues, des itinéraires ou contrôleur de réponses.

J'ai aussi cela dans le contrôleur de réponses que je pensais aider, mais n'a pas:

def top 
    @post = Post.find(params[:post_id]) 
end 

Toute aide est très appréciée! C'est ma première publication et je suis complètement nouveau à Ruby on Rails et à la programmation.

Voici l'erreur complète du terminal:

Started GET "/top" for ::1 at 2017-01-21 21:17:03 -0500 
Processing by ResponsesController#top as HTML 
    Post Load (0.1ms) SELECT "posts".* FROM "posts" WHERE "posts"."id" = ? LIMIT 1 [["id", nil]] 
Completed 404 Not Found in 2ms (ActiveRecord: 0.1ms) 

ActiveRecord::RecordNotFound (Couldn't find Post with 'id'=): 
    app/controllers/responses_controller.rb:46:in `set_post' 
+0

Qu'est-ce que vos tables de migration ressemblent? Y a-t-il un champ post_id? –

+0

Il existe un champ post_id pour la table des réponses: create_table "responses", force:: cascade do | t | t.integer "post_id" t.integer "user_id" t.text "corps" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.boolean "top" , par défaut: false fin –

Répondre

0

Première link_to est similaire à <a> donc à votre avis, vous devez mettez link_to l'intérieur d'un <a> est comme mettre un <a> à l'intérieur d'un <a>. Selon vous mettre:

<% if @post.user == current_user && @post.responses.where(top: true).size >= 1 %> 
     <%= link_to "finalize top", { controller: :responses, action: :top, id: @post.id },{ class: 'btn btn-default'} %> 

Dans votre contrôleur:

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

Dans routes.rb

get '/top' => 'responses#top' 
+0

Merci Anass, j'ai encore espoir. J'ai aussi dû changer le def set_post à juste: id au lieu de: post_id et ça a marché. Merci encore et je vais upvote quand je gagne plus de points sur stackoverflow. –

+0

Voici ce que les programmeurs sont censés faire en s'entraidant, je suis heureux d'avoir pu vous aider –

0

J'essaieraient:

def top 
    @post = Post.find(params[:id]) 
end 
+0

Il me donne la même erreur exacte pour une raison quelconque après avoir essayé cela. –

+0

Également vouloir ajouter que la ligne vers laquelle pointe l'erreur est le def set_post dans le contrôleur de réponses: Source extraite (autour de la ligne # 46): privé def set_post @post = Post.find (params [: post_id]) fin –