2013-10-01 9 views
7

के लिए रेल 4 में टोकन के साथ एक अद्वितीय URL जनरेट मैं एक 'प्रतिक्रिया' मॉडल जिससे एक उपयोगकर्ता उसकी/उसके काम के प्रदर्शन पर प्रतिक्रिया के लिए अनुरोध करने में सक्षम होना चाहिए है। मैंने एक नया फीडबैक अनुरोध बनाने के लिए बुनियादी दस्तावेज लिखे हैं, और प्रदाता को अनुरोध भेजने के लिए मेलर (व्यक्ति जो फीडबैक के साथ जवाब देगा)।एक बाहरी रूप प्रतिक्रिया

मैं सलाह समुदाय से लागू करने पर चाहते हैं निम्नलिखित:

  • एक बार एक नया प्रतिक्रिया अनुरोध बनाई गई है, ई-मेल भेज दिया जाता है कि एक फार्म जहां प्रदाता अपने इनपुट कर सकते हैं करने के लिए एक लिंक शामिल करना चाहिए उपयोगकर्ताओं के प्रदर्शन पर प्रतिक्रिया।
  • प्रतिक्रिया प्रदाता लॉग-इन या साइन-अप किसी भी तरह से (आवेदन करने के लिए पूरी तरह से अर्थात बाह्य) के लिए आवश्यक नहीं किया जाना चाहिए।
  • एक बार प्रस्तुत की, प्रदाता से प्रतिक्रिया प्रणाली में कब्जा किया जाना चाहिए।

अब, मैं इसे लागू करने के लिए निम्न विचार है, लेकिन यकीन है कि अगर यह सबसे अच्छा तरीका है आगे बढ़ने के लिए है नहीं कर रहा हूँ:

  • एक नया प्रतिक्रिया अनुरोध के निर्माण पर एक अद्वितीय टोकन जेनरेट करें । कुछ ऐसा: Best way to create unique token in Rails?
  • टोकन को फिर 'फीडबैक' तालिका में दर्ज किया जाना चाहिए।
  • मेलर तो चर उत्पन्न करनी चाहिए (जैसे @url) जो अन्य नियंत्रक के लिए लिंक उत्पन्न करता है (मान लीजिए कि 'external_feedback' और कार्रवाई जो लॉग-इन (जैसे कोई before_filter की आवश्यकता नहीं है चलो:। Authenticate_user वसीयत से)
  • यूआरएल यही कारण है कि विशिष्ट प्रतिक्रिया अनुरोध के लिए टोकन के माध्यम से एक पैरामीटर शामिल करना चाहिए।
  • कार्रवाई की प्रतिक्रिया के अनुरोध और एक रूप simple_form साथ उत्पन्न अद्यतन करने के लिए होना चाहिए।

पूरी बात एक प्रश्नावली का जवाब देने के समान है या सर्वेक्षण (जैसे सर्वेक्षण बंदर)

कुछ शोध के बाद मेरा मानना ​​है कि फ्रेंडली आईडी मणि यहां उपयोगी हो सकता है। मैं http://guides.rubyonrails.org/form_helpers.html की धारा 8 भी पढ़ रहा था और शायद मुझे औपचारिक अर्थ में एक प्रामाणिकता_टोकन को लागू करने की आवश्यकता है। मैं वास्तव में क्या देख रहा हूं:

  • क्या उपरोक्त दृष्टिकोण यह करने के लिए आम तौर पर सही तरीका है?
  • यदि हां, तो आप इसे कैसे कार्यान्वित करेंगे इस पर कोई विशेष जानकारी (दोस्ताना आईडी के साथ या उसके बिना)?
  • क्या आप ऐसे यूआरएल/टोकन उत्पन्न करने के लिए मौजूद किसी भी रत्न के बारे में जानते हैं?

अग्रिम धन्यवाद। मैं अब मॉडल और नियंत्रक विवरण की वर्तमान स्थिति के शामिल कर रहा हूँ:

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 

और ये मेरे मेलर है:

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 

उत्तर

13

एक सूचकांक के साथ प्रतिक्रिया मॉडल के लिए एक टोकन फ़ील्ड जोड़ें और पॉप्युलेट करने के लिए एक कॉलबैक जोड़ने उदाहरण बनाते हैं प्रतिक्रिया।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 

अब सुनिश्चित करें कि वे एप्लिकेशन/विचारों में

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

तो वसीयत द्वारा अस्वीकार कर दिया बचने के प्रदाताओं प्रतिक्रिया

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

अपने नियंत्रक में के लिए एक नया मार्ग को जोड़ने /feedback/provider.html.haml आप इसे सही अद्यतन स्थान पर भेजने के लिए सरल_form में url का उपयोग कर सकते हैं और केवल वह इनपुट प्रदान कर सकते हैं जिसे उन्हें देखना चाहिए।

f.inputs :p_comment 

अब अपने मेलर अद्यतन करें।

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

आप इस अनुकूल आईडी का उपयोग कर के लिए इसी तरह कुछ कर सकते हैं लेकिन आप अभी भी अद्वितीय स्लग के कुछ प्रकार बनाने के लिए और फिर बजाय Feedback.friendly.find का उपयोग की आवश्यकता होगी। मुझे लगता है कि आप यह सुनिश्चित करने के लिए एक टोकन के साथ गठबंधन करना चाहते हैं कि यह अभी भी प्रदाता फ़ीडबैक दे रहा है - इसलिए एकमात्र लाभ वास्तव में सही आईडी/गिनती को छुपाएगा। मुझे लगता है कि आपको p_ * फ़ील्ड को प्रदाता_ * में अपडेट करना चाहिए ताकि अगली देव जानता है कि इसमें क्या है - यह 90 के दशक का नहीं है!

+0

ग्रेट प्रतिक्रिया, धन्यवाद डेविड। मेरे लिए सही काम किया। – turkeyman84

+0

क्या यह टोकन पीढ़ी तर्क प्राथमिक कुंजी जैसे अद्वितीय टोकन बनाए रखेगा? या यह टोकन डुप्लिकेट करता है? उदाहरण के लिए: कहें कि यह यादृच्छिक रूप से एक टोकन "123" उत्पन्न हुआ है। तो क्या कोई मौका है कि यह यादृच्छिक रूप से फिर से "123" उत्पन्न करेगा? – John

+5

@ जॉन इस बात पर निर्भर करता है कि आपकी वेबसाइट कितनी ट्रैफ़िक प्राप्त करती है, यह टोकन पीढ़ी तर्क एक डुप्लिकेट टोकन उत्पन्न कर सकता है जितनी बार एक बार क्वाड्रिलियन बार में। टोकन पर एक अद्वितीय इंडेक्स डालने के लिए यह अधिक सुरक्षित होगा और 'शुरू करें; self.token = SecureRandom.hex [0,10] .upcase; बचाव ActiveRecord :: RecordNotUnique; पुन: प्रयास; end' –

संबंधित मुद्दे