2009-06-15 10 views
12
redirect_to :controller=>'groups',:action=>'invite' 

mais j'ai eu l'erreur parce que redirect_to envoyer la méthode GET Je veux changer cette méthode en 'POST' il n'y a pas: option de méthode dans redirect_to que ferai-je? Puis-je le faire sans redirect_to.Rails redirect_to méthode de publication?

Edit:

Je présente en groupe/invite.html.erb

<%= link_to "Send invite", group_members_path(:group_member=>{:user_id=>friendship.friend.id, :group_id=>@group.id,:sender_id=>current_user.id,:status=>"requested"}), :method => :post %> 

Cet appel Créer un lien dans l'action contrôleur GROUP_MEMBERS, et après créer une action effectuée, je veux montrer des groupes/inviter. html.erb avec group_id (je veux dire, après, cliquez sur « envoyer une invitation » GROUP_MEMBERS seront créés et la page en cours seront affichés) comme ceci:

redirect_to :controller=>'groups',:action=>'invite',:group_id=>@group_member.group_id 

après demande de redirect_to e est avec la méthode GET, il appelle une action show dans le groupe et prendre inviter comme identifiant et donner cette erreur

Couldn't find Group with ID=invite 

Mon inviter l'action dans le groupe

def invite 
@friendships = current_user.friendships.find(:all,:conditions=>"status='accepted'") 
@requested_friendships=current_user.requested_friendships.find(:all,:conditions=>"status='accepted'") 
@group=Group.find(params[:group_id]) 
end 

La solution est que je dois redirigez avec la méthode POST mais je ne pouvais pas trouver un moyen.

Solution laide: J'ai résolu ce problème que je ne préfère pas. J'attends toujours si tu as une solution équitable.

Ma solution est d'ajouter une route pour inviter à se débarrasser de l'erreur 'Impossible de trouver le groupe avec l'ID = invite'.

dans routes.rb

map.connect "/invite",:controller=>'groups',:action=>'invite' 

à créer une action

redirect_to "/invite?group_id=#{@group_member.group_id}" 

J'appelle cette solution en langage mai 'amele yontemi' en anglais 'méthode ouvrier' (je pense).

+0

pourquoi voudriez-vous le faire de cette façon? pourriez-vous fournir plus de contexte? – marcgg

+0

D'accord, nous avons besoin de plus d'informations sur ce que vous essayez d'atteindre avant de pouvoir vraiment vous donner une bonne réponse. –

+2

duplication possible de [rediriger \ _utiliser POST dans les rails] (http://stackoverflow.com/questions/985596/redirect-to-using-post-in-rails) –

Répondre

9

On dirait que vous avez trouvé trébuché par la façon dont Rails routage fonctionne. Ce code:

redirect_to :controller=>'groups',:action=>'invite',:group_id=>@group_member.group_id 

crée une URL qui ressemble à /groups/invite?group_id=1.

Sans le mappage dans votre routes.rb, le routeur Rails mappe cela à l'action show, pas invite. La partie invite de l'URL est mappée à params[:id] et lorsqu'elle essaie de trouver cet enregistrement dans la base de données, elle échoue et vous obtenez le message que vous avez trouvé.

Si vous utilisez des itinéraires RESTful, vous avez déjà une ligne map.resources qui ressemble à ceci:

map.resources :groups 

Vous devez ajouter une action personnalisée pour invite:

map.resources :groups, :member => { :invite => :get } 

changer ensuite votre référence à params[:group_id] dans la méthode #invite pour utiliser seulement params[:id].

31

La réponse est que vous ne pouvez pas faire un POST en utilisant un redirect_to.

C'est parce que ce redirect_to n'est tout simplement envoyer un en-tête de redirection HTTP 30x au navigateur qui à son tour a l'URL de destination, et les navigateurs ne font que se répand sur réoriente

+4

Ouais j'ai compris mais il y a un moyen de résoudre mon problème avec redirect_to ou sans? –

5

J'ai trouvé une solution de contournement nécessaire pour que cela se produise dans Rails 3. J'ai créé une route qui appelait la méthode de ce contrôleur nécessitant un appel post-appel. Une ligne « route.rb », tels que:

match '/create', :to => "content#create" 

Il est probablement laid, mais les temps désespérés appellent des mesures désespérées. Je pensais juste partager.

Questions connexes