ruby-on-rails-4 – 在Rails 4中使用令牌生成一个唯一的URL,用于外部表单响应

前端之家收集整理的这篇文章主要介绍了ruby-on-rails-4 – 在Rails 4中使用令牌生成一个唯一的URL,用于外部表单响应前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个“反馈”模型,用户应该可以请求他/她的工作表现反馈.我已经编写了用于创建新反馈请求的基本操作,以及用于将请求发送给提供者的邮件程序(将通过反馈回复的人).

我希望社区提供有关实施以下内容的建议:

>创建新的反馈请求后,发送的电子邮件应包含指向表单的链接,供应商可以在其中输入有关用户性能的反馈.
>不应要求反馈提供者以任何方式登录注册(即完全在应用程序外部).
>提交后,应提交来自提供者的反馈意见
系统.

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

>在创建新的反馈请求时生成唯一令牌.像这样:Best way to create unique token in Rails?.
>然后应将令牌输入“反馈”表.
> Mailer应该生成变量(例如@url),它生成到另一个控制器的链接(假设’external_Feedback’和不需要登录的动作(例如,没有来自Devise的before_filter:authenticate_user!).
>该URL应包含带有特定反馈请求令牌的参数.
>操作应该是更新’反馈’请求和使用simple_form生成的表单.

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

经过一些研究后,我相信Friendly ID gem在这里很有用.我也在阅读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

解决方法

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

猜你在找的Ruby相关文章