10

我有一个“反馈”模型,用户应该能够请求关于他/她的工作表现的反馈。我已经编写了用于创建新反馈请求的基本操作,以及用于将请求发送给提供者(将提供反馈的人)的邮件程序。

我想从社区获得有关实施以下内容的建议:

  • 创建新的反馈请求后,发送的电子邮件应包含指向表单的链接,提供者可以在该表单中输入他对用户表现的反馈。
  • 不应要求反馈提供者以任何方式登录或注册(即完全在应用程序之外)。
  • 提交后,应在系统中捕获来自提供者的反馈。

现在,我有以下想法来实现它,但不确定这是否是最好的方法:

  • 在创建新的反馈请求时生成唯一令牌。像这样:在 Rails 中创建唯一令牌的最佳方法?.
  • 然后应将令牌输入到“反馈”表中。
  • 然后,Mailer 应该生成变量(例如 @url),该变量生成到另一个控制器的链接(比如说“external_feedback”和不需要登录的操作(例如,没有 before_filter :authenticate_user! from Devise)。
  • 该 URL 应包含一个带有特定反馈请求令牌的参数。
  • 操作应该是更新“反馈”请求和使用 simple_form 生成的表单。

整个事情类似于回答问卷或调查(如Survey Monkey)。

经过一些研究,我相信Friendly ID gem在这里可能有用。我也在阅读http://guides.rubyonrails.org/form_helpers.html的第 8 节,也许我需要在形式上实现一个authenticity_token。我真正想要的是:

  • 上述方法是通常正确的方法吗?
  • 如果是这样,您将如何实施它(有或没有友好 ID)的任何细节?
  • 您是否知道任何用于生成此类 URL/令牌的 gem?

先感谢您。我现在包括模型和控制器详细信息的当前状态:

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
4

1 回答 1

16

使用索引将令牌字段添加到反馈模型并添加回调以在创建时填充它,例如 feedback.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

然后在 app/views/feedback/provider.html.haml 中,您可以使用 simple_form 中的 url 将其发送到正确的更新位置,并且只提供他们应该看到的输入。

f.inputs :p_comment

现在更新您的邮件程序。

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

您可以使用友好的 id 执行类似的操作,但您仍然需要创建某种独特的 slug,然后使用 Feedback.friendly.find 代替。我认为您可能希望将它与令牌结合使用,以确保它仍然是提供反馈的提供者 - 所以唯一的好处就是隐藏真实的 id/count。我认为您应该将 p_* 字段更新为 provider_* 以便下一个开发人员知道其中的内容 - 这不是 90 年代!

于 2013-10-01T18:38:18.753 回答