2013-10-01 8 views
7

Ich habe ein "Feedback" -Modell, mit dem ein Benutzer Feedback zu seiner/ihrer Arbeitsleistung anfordern kann. Ich habe grundlegende Aktionen geschrieben, um eine neue Rückmeldungsanfrage zu erstellen, und den Mailer, um die Anfrage an den Anbieter zu senden (Person, die mit Rückmeldung antwortet).Generieren einer eindeutigen URL mit Tokens in Rails 4 für eine externe Formularantwort

würde Ich mag Rat von der Gemeinschaft des an der Umsetzung folgenden:

  • Sobald eine neue Feedback-Anfrage, erstellt die E-Mail, die einen Link zu einem Formular enthalten soll, wo der Anbieter eingeben kann seine gesendet wird Feedback zur Benutzerleistung.
  • Der Feedback-Anbieter sollte nicht verpflichtet sein, sich in irgendeiner Weise anzumelden oder zu registrieren (d. H. Vollständig außerhalb der Anwendung).
  • Nach der Übermittlung sollte das Feedback des Anbieters im System erfasst werden.

Jetzt habe ich folgende Ideen zu ihrer Umsetzung, aber ich bin nicht sicher, ob dies der beste Weg ist, um fortzufahren:

  • Erzeugt eine eindeutige Token auf die Schaffung eines neuen Feedback-Anfrage . Etwas wie dieses: Best way to create unique token in Rails?.
  • Das Token sollte dann in die "Feedback" -Tabelle eingegeben werden.
  • Mailer sollte dann erzeugen Variable (zB @url), die Verbindung zu einem anderen Controller erzeugt (sagen wir mal 'external_feedback' und Aktion, die nicht log-in erforderlich ist (zB keine before_filter:. Authenticate_user von Devise)
  • Diese URL enthalten sollte Anforderung einen Parameter mit dem Token für die spezifische Feedback.
  • die Aktion sollte die ‚Feedback‘ Anfrage und ein Formular mit simple_form.

Das ganze ist auf einen Fragebogen zu reagieren ähnlich erzeugt zu aktualisieren sein oder Umfrage (wie Survey Monkey).

Nach ein paar Recherchen glaube ich, dass das Friendly ID Juwel hier nützlich sein kann. Ich habe auch Abschnitt 8 von http://guides.rubyonrails.org/form_helpers.html gelesen und vielleicht muss ich ein authenticity_token im formellen Sinne implementieren. Was ich wirklich suche ist:

  • Ist der obige Ansatz der allgemein richtige Weg, dies zu tun?
  • Wenn ja, irgendwelche Besonderheiten, wie Sie es implementieren würden (mit oder ohne Friendly ID)?
  • Kennen Sie irgendwelche Edelsteine, die existieren, um solche URLs/Tokens zu erzeugen?

Vielen Dank im Voraus. Ich bin auch jetzt den aktuellen Stand der Modell- und Regler Details:

feedback.rb 
# == Schema Information 
# 
# Table name: feedbacks 
# 
# id   :integer   not null, primary key 
# user_id  :integer 
# p_first_name :string(255) 
# p_last_name :string(255) 
# p_email  :string(255) 
# goal_id  :integer 
# u_comment :text 
# p_comment :text 
# created_at :datetime 
# updated_at :datetime 
# 

class Feedback < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :goal 

    has_many :feedback_attributes 

    validates_presence_of :p_first_name, :p_last_name, :p_email, :goal_id 

end 

Und das ist mein Mailer:

class FeedbackMailer < ActionMailer::Base 

    def feedback_request(user, feedback) 
    @user = user 
    @feedback = feedback 
    @url = 'http://thisistheexampleurlforfeedback' 
    mail(to: @feedback.p_email, subject: "#{@user.first_name} #{@user.last_name} has requested your feedback", from: @user.email) 
    end 

end 

Antwort

13

ein Token-Feld auf das Feedback-Modell mit einem Index hinzufügen und einen Rückruf hinzufügen zu füllen es auf erstellen z Rückmeldung.

rb
before_create :add_token 
private 
def add_token 
    begin 
    self.token = SecureRandom.hex[0,10].upcase 
    end while self.class.exists?(token: token) 
end 

jetzt eine neue Route für die Feedback-Anbieter hinzufügen

resources :feedbacks do 
    get 'provider' 
    put 'provider_update' # you might not need this one, if you are happy to use update 
end 

In Ihrem Controller sicherstellen, dass sie nicht von devise abgelehnt bekommen

before_filter :authenticate_user!, except: [:provider, :provider_update] 
... 
def provider 
    @feedback = Feedback.find_by token: params[:token] 
end 

dann in der app/views /feedback/provider.html.haml Sie können die URL in simple_form verwenden, um sie an den richtigen Speicherort zu senden und nur die Eingabe bereitzustellen, die sie sehen sollten.

f.inputs :p_comment 

Jetzt aktualisieren Sie Ihre Mailer.

@url = provider_feedback_url(@feedback, token: @feedback.token) 

Sie könnten etwas Ähnliches wie dies mit freundlicher id tun, aber Sie müßten auch noch eine Art von einzigartiger Slug erstellen und dann Feedback.friendly.find stattdessen verwenden. Ich denke, du würdest es mit einem Token kombinieren wollen, um sicherzustellen, dass es immer noch der Anbieter ist, der das Feedback gibt - der einzige Vorteil wäre also, die wahre ID/Anzahl zu verbergen. Ich denke, du solltest p_ * Felder auf provider_ * aktualisieren, damit der nächste Entwickler weiß, was drin ist - es sind nicht die 90er!

+0

Große Antwort, danke David. Arbeitete perfekt für mich. – turkeyman84

+0

ist diese Token-Generation Logik wird einzigartige Token wie Primärschlüssel erhalten? oder es dupliziert das Token? für zB: Sagen Sie es zufällig erzeugt ein Token "123". Gibt es eine Chance, dass es wieder "123" zufällig generiert? – John

+5

@John Abhängig davon, wie viel Verkehr Ihre Website erhält, könnte diese Token-Generierungslogik ein doppeltes Token so oft wie einmal in einer Billiarde Mal generieren. Es wäre viel sicherer, einen eindeutigen Index auf Token zu setzen und 'anzufangen'; self.token = SecureRandom.hex [0,10] .upcase; Rettung ActiveRecord :: RecordNotUnique; wiederholen; Ende –