2011-05-02 2 views
0

Lorsque vous essayez d'accéder à la page d'index des raisonsNameError - variable locale définie ou méthode en appelant la méthode créée dans le contrôleur

NameError in Reasons#index 

Showing /home/alec/workspace/rails/nwis/app/views/reasons/index.html.erb where line #26 raised: 

undefined local variable or method `upvote_reason' for #<#<Class:0x000000023d9940>:0x000000023d3298> 
Extracted source (around line #26): 

23:  <td><%= link_to 'Show', reason %></td> 
24:  <td><%= link_to 'Edit', edit_reason_path(reason) %></td> 
25:  <td><%= link_to 'Destroy', reason, :confirm => 'Are you sure?', :method => :delete %></td> 
26: <td><%= link_to "Vote up", :action => upvote_reason, :id => reason.id %></td> 
27: </tr> 
28: <% end %> 
29: </table> 
Rails.root: /home/alec/workspace/rails/nwis 

Application Trace | Framework Trace | Full Trace 
app/views/reasons/index.html.erb:26:in `block in _app_views_reasons_index_html_erb__2084449067598068298_18776480__4598497200926455905' 
app/views/reasons/index.html.erb:16:in `each' 
app/views/reasons/index.html.erb:16:in `_app_views_reasons_index_html_erb__2084449067598068298_18776480__4598497200926455905' 
app/controllers/reasons_controller.rb:7:in `index' 

La ligne dans la vue:

<td><%= link_to "Vote up", :action => upvote_reason, :id => reason.id %></td> 

La méthode dans le contrôleur:

def upvote_reason 
    @reason = Reason.find(params[:id]) 
    @reason.upvote += 1 
    @reason.save 
    redirect_to reason_path 
end 

il est vrai que je suis assez nouveau à Rails, mais je sens que je suis sur le point de celui-ci en cliquant, une fois Je peux comprendre comment interagir correctement avec le contrôleur. Si quelqu'un peut me diriger dans la bonne direction vers un tutoriel qui couvre bien ce sujet, je serais heureux de vérifier si c'est une question trop basique.

Répondre

3

Mettez deux points avant pour le transformer en un symbole, ou de mettre des guillemets autour:

:action => :upvote_reason 

ou

:action => "upvote_reason" 

De plus, vous aurez besoin de mettre à jour vos itinéraires. Alors que vous avez juste actuellement probablement resources :reasons vous voulez quelque chose comme ceci:

resources :reasons do 
    get "upvote_reason", :on => :member 
end 

En fait, après avoir ajouté cette route, vous pouvez simplement utiliser le nom au lieu de votre itinéraire :action et :id params:

<%= link_to "Vote up", upvote_reason_reason_path(reason) %> 

(Si vous venez de renommer votre action upvote_reason à upvote, cela deviendrait upvote_reason_path(reason))

+0

Merci! Cependant, cela a conduit à une erreur de routage: 'Aucune route correspond {: action =>" upvote_reason ",: id => 1,: controller =>" raisons "}' - Je pensais que l'utilisation de link_to générerait automatiquement un lien vers le méthode de contrôleur appropriée et donnée id param? – Alec

+0

Voir mes modifications re: votre fichier routes.rb. –

Questions connexes