2013-10-01 18 views
7

我有一個「反饋」模型,用戶應該能夠針對他/她的工作性能請求反饋。我已經編寫了基本的行動來創建一個新的反饋請求,以及將請求發送給提供者(將回應反饋的人)的郵件程序。使用Rails 4中的令牌生成一個唯一的URL,以獲得外部表單響應

我會從社區想諮詢關於執行以下操作:

  • 一旦創建了新的反饋請求,發送電子郵件應該包含一個鏈接到一個形式,其中提供者可以輸入他對用戶性能的反饋。
  • 反饋提供者不應被要求以任何方式登錄或註冊(即完全在應用程序外部)。
  • 提交後,應該在 系統中捕獲提供者的反饋。

現在,我有以下的思路去實現它,但我不知道這是否是繼續進行的最佳方式:

  • 生成於創建一個新的反饋請求的唯一標記。像這樣:Best way to create unique token in Rails?
  • 然後應該將令牌輸入到「反饋」表中。然後
  • 梅勒應該產生變量(例如@url),其生成鏈接到另一個控制器(讓我們說「external_feedback」和行動不需要登錄(例如沒有的before_filter:!的authenticate_user從設計)
  • 該網址應包含的參數與令牌的特定反饋請求。
  • 動作要更新「反饋」請求,並用simple_form產生的形式。

整個事情是類似於響應一個問卷或調查(如Survey Monkey)

經過一番研究,我相信這裏的Friendly ID寶石可能會很有用。我也在閱讀http://guides.rubyonrails.org/form_helpers.html的第8部分,也許我需要在正式意義上實現authenticity_token。我真正想要的是:

  • 上述方法是否正確地執行此操作?
  • 如果是這樣,關於如何實現它的任何細節(帶或不帶友好ID)?
  • 你是否知道存在用於生成此類URL /令牌的任何寶石?

在此先感謝您。我現在包括模型和控制器的細節目前的狀態:

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 

現在添加一個新的路線爲供應商反饋

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

在你的控制器,確保它們不會被拒絕色器件

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

然後在應用程序/視圖/feedback/provider.html.haml,你可以使用simple_form中的url將它發送到正確的更新位置,並只提供他們應該看到的輸入。

f.inputs :p_comment 

現在更新您的郵件。

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

你可以做類似這樣使用友好的id的東西,但你仍然需要建立某種形式的獨特塞,然後使用Feedback.friendly.find代替。我想你會希望將它與令牌結合起來,以確保它仍然是提供反饋的提供者 - 所以唯一的好處就是隱藏真正的ID /計數。我想你應該將p_ *字段更新爲provider_ *,以便下一個開發人員知道它的內容 - 這不是90年代!

+0

非常感謝,感謝David。爲我完美工作。 – turkeyman84

+0

這個令牌生成邏輯將維護唯一的令牌,如主鍵?或者它重複了令牌?例如:說它隨機生成一個標記「123」,那麼它是否有機會再次隨機生成「123」? – John

+5

@John取決於你的網站獲得多少流量,這個令牌生成邏輯可以生成一個重複的令牌,一次可以達到四十億次。在令牌上放置一個唯一的索引並開始做起來會更安全。 self.token = SecureRandom.hex [0,10] .upcase;救援ActiveRecord :: RecordNotUnique;重試; end' –

相關問題