我有一个"反馈"模型,用户应该能够请求对其工作表现的反馈。我已经编写了用于创建新的反馈请求的基本操作,以及用于将请求发送给提供者(将回复反馈的人(的邮件程序。
我希望社区就实施以下内容提供建议:
- 创建新的反馈请求后,发送的电子邮件应包含指向表单的链接,提供商可以在其中输入他对用户性能的反馈。
- 不应要求反馈提供者以任何方式登录或注册(即完全在应用程序外部(。
- 提交后,应在系统。
现在,我有以下想法来实现它,但不确定这是否是最好的方法:
- 在创建新的反馈请求时生成唯一令牌。像这样的东西:在Rails中创建唯一令牌的最佳方式?
- 然后,应将令牌输入到"反馈"表中。
- 然后,Mailer 应该生成变量(例如 @url(,该变量生成指向另一个控制器的链接(假设"external_feedback"和不需要登录的操作(例如,没有来自 Devise 的 before_filter :authenticate_user!
- 该 URL 应包含一个参数,其中包含特定反馈请求的令牌。
- 操作应该是更新"反馈"请求和使用simple_form生成的表单。
整个事情类似于回答问卷或调查(如调查猴子(。
经过一些研究,我相信友好 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
使用索引向反馈模型添加一个标记字段,并添加一个回调以在创建时填充它,例如反馈.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
然后在应用/视图/反馈/提供程序.html.haml 中,您可以使用 simple_form 中的 URL 将其发送到正确的更新位置,并仅提供他们应看到的输入。
f.inputs :p_comment
现在更新您的邮件。
@url = provider_feedback_url(@feedback, token: @feedback.token)
您可以使用友好 id 执行类似操作,但您仍然需要创建某种独特的 slug,然后改用 Feedback.friendly.find。我认为您希望将其与令牌结合使用,以确保它仍然是提供反馈的提供者 - 因此唯一的好处实际上是隐藏真实的 id/计数。我认为您应该将p_*字段更新为provider_*,以便下一个开发人员知道其中的内容 - 这不是90年代!