2010-10-06 5 views
2

Je ne comprends pas vraiment les avantages et les inconvénients de l'utilisation des requêtes "post" vs "get" vs "put", des actions de contrôleurs personnalisés et de l'utilisation de liens ou de formulaires /boutons. Disons que j'ai une simple liste de choses à faire avec des tâches, et un contrôleur de tâches, et je veux une action "complète" où je trouve une tâche spécifique dans la DB et mettre à jour son attribut status de "incomplete" à "Achevée."Rails 3, Actions personnalisées et méthodes de requête HTML

def complete 
    @task = Task.find(params[:id]) 
    if @task.update_attributes(:status => "complete") 
    redirect_to tasks_url, :notice => "Completed!" 
    else 
    redirect_to tasks_url, :error => "Whoops." 
    end 
end 

Quelle est la meilleure façon pratique de définir cette voie, cette méthode demande HTML dois-je utiliser (post? Mis? Obtenir?), Et devrais-je utiliser un lien simple ou une forme? (Et notez: supposons que mon modèle de sécurité d'utilisateur est tout compris avec concevoir, et approprié avant les filtres, etc.)

Et surtout, comment articuler tout cela dans un fichier Rails 3 routes.rb?

Note, le code ci-dessous ne fonctionnait pas vraiment pour moi: si actuellement

#routes.rb 
resources :tasks do 
    members do 
    post 'complete' 
    end 
end 

J'utilise ceci:

#routes.rb 
match 'tasks/:id/complete', 'tasks#complete', :as => "complete_task" 

#view 
= link_to "Complete", complete_task_path(:id => @task.id) 

Mais cela déclenche une requête get, et je me sens comme il devrait être un "put" ou un "post". Ou devrait-il être un lien du tout? Devrait-il être un formulaire avec des champs cachés?

Répondre

2

méthode "link_to" génère habituellement une balise d'ancrage à savoir "<un> </a >", à savoir une demande régulière GET

faire une requête POST en utilisant link_to vous devriez faire la

suivante
 
= link_to "Complete", complete_task_path(:id => @task.id), :method => :post 

Rappelez-vous que si javascript est désactivé dans le navigateur, l'instruction ci-dessus reviendra à une requête GET au lieu de POST.