2010-07-29 6 views
3

J'ai un formulaire_for dans un modèle new.html.erb où je fais la sauvegarde normale à la DB, puis un e-mail en cas de succès. Je veux que l'expéditeur envoie le même new.html.erb que le corps et transmette le modèle afin que le formulaire soit entièrement rempli. Je reçois l'erreur suivante:Réutilisation formulaire_for en vue d'un mailer erreurs sur la falsification

undefined method `protect_against_forgery?' for #<#<Class:0x000000049d7110>:0x000000049d4690> 

Sur la ligne immédiatement après la balise form_for (car il est l'injection de l'étiquette jeton auth je pense). Est-ce que je peux contourner ceci pour que je puisse réutiliser le modèle dans l'expéditeur?

Voici ce que le code de mailer ressemble

class MaintenanceMailer < ActionMailer::Base 
    helper :application 

    def request_email(maintenance) 
    mail :to => maintenance.community.email, :subject => "Maintenance" do |format| 
     format.html { render :layout => 'default', :template => 'maintenance/new' } 
    end  
    end 
end 

Répondre

6

Ajouter à un assistant que seul votre modèle de mailer utilise:

def protect_against_forgery? 
     false 
    end 

Mais assurez-vous que le contrôleur de réception ignore le verify_authenticity_token, et que session jacking est ok pour ce que cette forme porte.

+0

J'ai essayé plus tôt et il me donne une autre erreur: ActionController :: InvalidAuthenticityToken Je souhaite que cette action vérifie l'authenticité d'une demande de page normale pour le formulaire. Dois-je envoyer quelque chose au contrôleur une fois que je suis dans l'expéditeur? Tout ce qu'il devrait faire est maintenant de rendre ce "nouveau" modèle sans retour au contrôleur. – jpfuentes2

+0

Oui, c'est la partie "verify_authenticity_token" qui saute. La syntaxe pour le faire dans votre contrôleur (en haut) est: skip_before_filter: verify_authenticity_token,: only => [: my_form_action] –

4

J'ai utilisé la méthode Sam C, mais je l'ai légèrement ajustée. Juste avant d'appeler le rendu en chaîne, je substitue la méthode.

ApplicationHelper.send(:define_method, :protect_against_forgery?) { false } 
html = render_to_string(template: "quotations/show", layout: "application_print") 

Cela remplace la classe protect_against_forgery? méthode temporairement.

0

J'ai eu le même problème en travaillant dans une page de vente de maison. Utilisez-vous form_for dans votre modèle d'e-mail? Parce que c'était mon problème, je l'ai construit en utilisant div à la place form_for et tout a bien fonctionné.

0

vous pouvez simplement désactiver l'authenticité du form_for dans le template.new.html pour éviter de telles erreurs

vous pouvez vérifier pour How do i remove the authenticity_token from rails forms

+0

Je comprends que vous ne pouvez pas encore écrire de commentaire. Lorsque vous publiez des liens dans/comme réponse, essayez de résumer l'idée principale que le lien pourrait développer. –

Questions connexes