2 votes

Comment créer une méthode personnalisée dans Rails ?

J'essaie actuellement d'utiliser une méthode personnalisée dans Rails et je ne sais pas comment m'y prendre. En plus des méthodes par défaut dans le contrôleur, je voulais ajouter ce qui suit :

  def cancel
    @newsletter = Newsletter.find(params[:id])

   respond_to do |format|

  #SendGrid Newsletter API - Delete Newsletter Schedule
  SendGrid.delete_schedule(@newsletter.name)

  @newsletter.status = "CANCELLED"

  @newsletter.save

  format.html { redirect_to newsletters_url }
  format.json { head :no_content }
end

fin

Cette méthode est identique à la méthode par défaut :destroy, mais elle ne détruit pas réellement l'objet.

A mon avis, j'avais les éléments suivants :

<% @newsletters.each do |newsletter| %>
  <tr>
    <td><%= newsletter.identity %></td>
    <td><%= newsletter.name %></td>
    <td><%= newsletter.recipients %></td>
    <td><%= newsletter.subject %></td>
    <td><%= newsletter.html %></td>
    <td><%= newsletter.text %></td>
    <td><%= newsletter.schedule %></td>
    <td><%= newsletter.status %></td>
    <td><%= link_to 'Show', newsletter %></td>
    <td><%= link_to 'Edit', edit_newsletter_path(newsletter) %></td>
    <td><%= link_to 'Destroy', newsletter, method: :delete, data: { confirm: 'Are you sure?' } %></td>
    <td><% if newsletter.status == "SCHEDULED" %><%= link_to 'Cancel', newsletter, method: :cancel, data: { confirm: 'Cancel Schedule?' }%><% end %></td>

  </tr>
<% end %>

J'ai reçu l'erreur : Aucune route ne correspond à [POST] " _ URL de la newsletter __ "

Quand je rake les routes, il n'y a pas de route pour l'erreur ci-dessus. Puis-je savoir comment ajouter la route et pourquoi cette route est nécessaire ?


UPDATE Actuellement, j'ai toujours l'erreur no route matches. Vous trouverez ci-dessous tous mes fichiers relatifs à la méthode "Cancel" :

routes.rb

  resources :newsletters do
    match '/cancel/:id' => 'newsletters#cancel', :as => :cancel
  end

newsletters_controller.rb

def cancel @newsletter = Newsletter.find(params[:id])

respond_to do |format|

#SendGrid Newsletter API - Delete Newsletter Schedule
  SendGrid.delete_schedule(@newsletter.name)

  @newsletter.status = "CANCELLED"

  @newsletter.save

  format.html { redirect_to newsletters_path(@newsletter) }
  format.json { head :no_content }
end
end

newsletters/index.html.erb

<%= link_to 'Cancel', newsletter_cancel_path(newsletter) %>

2voto

aNoble Points 4880

Vous devriez avoir une ligne comme celle-ci dans votre config/routes.rb fichier

resources :newsletters

Vous voudrez le changer en ceci

resources :newsletters do
  member do
    put 'cancel'
  end
end

Vous voudrez jeter un coup d'œil au guide d'acheminement qui a été posté. Vous devrez également comprendre les principes de base du routage reposant et la façon dont Rails gère GET, POST, PUT, DELETE, etc.

1voto

Voici une explication complète sur le routage : http://guides.rubyonrails.org/routing.html

1voto

edralph Points 1711

Je pense que vous confondez method: dans l'argument de la link_to comme correspondant à la méthode dans le contrôleur. En fait, il s'agit des verbes HTTP RESTful, à savoir :post, :delete et :put. Il ne faut donc pas passer l'action du contrôleur de cette façon.

Au lieu de cela, vous pouvez passer les arguments :controller et :action...

Mieux encore, créez une route dans routes.rb et utilisez le chemin que rails génère.

match "/cancel/:id", to: "controller#cancel", as: :cancel

et ensuite le link_to serait quelque chose comme :

link_to 'Cancel', cancel_path(newsletter)

Mise à jour : L'erreur que vous obtenez provient de la redirect_to de votre méthode d'annulation (dans le contrôleur). Changez le newsletters_url en newsletter_path(@newsletter) à la place.

Si vous voulez rediriger vers la page de présentation d'une seule lettre d'information, vous devez faire ce qui précède (où vous passez le paramètre @newsletter), si vous voulez qu'il retourne à la page d'index des lettres d'information, alors ce sera newsletters_path .

Vous pouvez vérifier l'existence des routes en tapant rake routes dans votre terminal. Vous y verrez tous les noms de routes.

Obtenez-vous toujours une erreur après avoir changé pour redirect_to newsletter_path(@newsletter) ?

La chose qui n'est pas tout à fait vraie c'est que vous n'obtenez pas de route POST définie - ce qui indique généralement une route malformée. form_for . Examinez les formulaires liés à votre bulletin d'information, en particulier ceux pour lesquels vous ne remplissez pas le formulaire habituel. form_for @newsletter do |f| .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X