2010-05-17 5 views
0

Je suis totalement déçu de ce que je fais de mal avec le code suivant. J'essaie d'implémenter un système de messagerie au sein de mon application, mais je veux qu'il gère différents types de messages. Dans ce cas, je veux créer un message "request" de ': message_type => 1'. Au lieu d'utiliser des formulaires comme je le fais habituellement, je veux faire de cette instance le moment où le lien est cliqué. Voici comment je l'ai mis en place dans le fichier erb show pour « utilisateur »:Ruby on Rails: l'utilisation du nom de la méthode 'request' dans le contrôleur échoue

<%=link_to "Send friend request", :action=>"request", :controller => "messages", :id => @user.id %> 

et dans le contrôleur:

def request 
    @message = Message.new(:sender_id => current_user.id,:user_id => params[:id],:message_type => 1) 
    if @message.save 
     flash[:notice] = 'Message was successfully created.' 
     redirect_to message_path(@message) 
     else 
     redirect_to message_path(@message) 
     end 
    end 

Il en résulte dans le message d'erreur suivant: méthode non définie rewrite »pour nul: NilClass avec la trace ressemblant

c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/whiny_nil.rb:52:in `method_missing' 
    c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/base.rb:634:in `url_for' 
    (eval):16:in `message_path' 
    app/controllers/messages_controller.rb:11:in `request' 

J'ai utilisé map.resources: messages dans le fichier routes.rb, et fait le cas: has_ many and: belongs_to associations dans les modèles d'utilisateur et de message. EDIT: Une autre chose à noter est que la sauvegarde EST réussie, car une fois que l'adresse racine est entrée manuellement dans la barre d'adresse, l'avis "flash" indique que la sauvegarde a été faite. En utilisant la console de développement, il est effectivement là, donc il y a quelque chose de fâché avec la redirection.

Répondre

2

Vous voudrez peut-être renommer l'action, je suis tout à fait sûr que request signifie quelque chose dans le contrôleur. Pourquoi ne renommez-vous pas l'action de request en create, et voyez si ça aide.

Ainsi, le code sera:

De l'avis

<%=link_to "Send friend request", :action=>"create", :controller => "messages", :id => @user.id %> 

Dans le contrôleur

def create 
    @message = Message.new(:sender_id => current_user.id,:user_id => params[:id],:message_type => 1) 
    if @message.save 
     flash[:notice] = 'Message was successfully created.' 
     redirect_to message_path(@message) 
    else 
     redirect_to message_path(@message) 
    end 
    end 
+0

Wow . Je vous remercie.C'était une épreuve très frustrante. J'aimerais que ces messages d'erreur soient un peu plus descriptifs. C'est plutôt malchanceux – JackCA

+0

Ce bloc "else" est toujours un bug qui attend de se produire, comme je l'ai souligné dans ma réponse. Je suis content que vous ayez résolu votre problème immédiat. – jdl

+0

Oui, je viens de changer les deux rediriger vers "redirect_to: retour" mais merci! – JackCA

0

Vérifiez vos journaux de plus près, et vous trouverez probablement que votre sauvegarde échoue. Vous ne savez pas quelle ligne est # 11, mais je suppose que c'est dans votre bloc else, qui essaie de créer un chemin pour un objet @message avec un ID nil (il n'a pas été enregistré).

+0

ligne 11 est le redirect_to dans l'instruction if, pas d'autre ... – JackCA

+0

Changez-le en message_path (: id => @ message.id) - consignez aussi l'ID si cela échoue, et publiez ce que vous obtenez. – jdl

+0

En outre, votre condition "else" échouera définitivement si elle est atteinte. – jdl

Questions connexes