Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 在Rails 4中为外部表单响应生成带有标记的唯一URL_Ruby On Rails 4_Url Routing_Token_Friendly Id - Fatal编程技术网

Ruby on rails 4 在Rails 4中为外部表单响应生成带有标记的唯一URL

Ruby on rails 4 在Rails 4中为外部表单响应生成带有标记的唯一URL,ruby-on-rails-4,url-routing,token,friendly-id,Ruby On Rails 4,Url Routing,Token,Friendly Id,我有一个“反馈”模型,用户应该能够请求对其工作绩效的反馈。我已经编写了创建新反馈请求的基本操作,以及将请求发送给提供者(将提供反馈的人)的邮件程序 我想从社区获得关于实施以下内容的建议: 创建新的反馈请求后,发送的电子邮件应包含指向表单的链接,提供商可在该表单中输入其对用户绩效的反馈 反馈提供者不应被要求以任何方式登录或注册(即完全脱离应用程序) 提交后,供应商的反馈应记录在 系统 现在,我有以下想法来实施它,但不确定这是否是最好的方法: 在创建新反馈请求时生成唯一令牌。类似这样的内容:

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

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

  • 创建新的反馈请求后,发送的电子邮件应包含指向表单的链接,提供商可在该表单中输入其对用户绩效的反馈
  • 反馈提供者不应被要求以任何方式登录或注册(即完全脱离应用程序)
  • 提交后,供应商的反馈应记录在 系统
现在,我有以下想法来实施它,但不确定这是否是最好的方法:

  • 在创建新反馈请求时生成唯一令牌。类似这样的内容:
  • 然后应将令牌输入“反馈”表中
  • 然后,Mailer应该生成变量(例如@url),该变量生成到另一个控制器的链接(比如说“外部反馈”和不需要登录的操作(例如,过滤器前的“否”:从Desive验证用户”)
  • 该URL应包含一个带有特定反馈请求令牌的参数
  • 操作应该是更新“反馈”请求和使用简单表单生成的表单
整个过程类似于回答问卷或调查(比如调查猴子)

经过一些研究,我相信友好ID gem在这里可能有用。我还阅读了的第8节,也许我需要实现正式意义上的真实性令牌。我真正想要的是:

  • 上述方法通常是正确的吗
  • 如果是这样的话,您将如何实现它(有或没有友好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
feedback.rb
#==架构信息
#
#表名称:反馈
#
#id:整数不为空,主键
#用户id:integer
#p_名字:字符串(255)
#p_姓氏:字符串(255)
#p_电子邮件:字符串(255)
#目标id:整数
#注释:文本
#p_注释:文本
#创建时间:datetime
#更新时间:datetime
#
类反馈
这是我的邮件:

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
class FeedbackMailer
使用索引向反馈模型添加令牌字段,并添加回调以在创建时填充它,例如。 反馈.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
在控制器中,确保它们不会被Desive拒绝

before_filter :authenticate_user!, except: [:provider, :provider_update]
...
def provider
  @feedback = Feedback.find_by token: params[:token]
end
然后在app/views/feedback/provider.html.haml中,您可以使用简单形式的url将其发送到正确的更新位置,并且只提供他们应该看到的输入

f.inputs :p_comment
现在更新你的邮件

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

你可以使用友好id做类似的事情,但你仍然需要创建某种独特的slug,然后使用Feedback.friendly.find。我认为你应该将它与令牌结合起来,以确保它仍然是提供反馈的提供者-因此唯一的好处将是真正隐藏真实的id/计数。我认为你应该ld将p_*字段更新到provider_*以便下一个开发人员知道其中的内容-这不是90年代的问题!

回答得很好,谢谢David。对我来说效果很好。这个令牌生成逻辑会保持像主键一样的唯一令牌吗?还是它复制了令牌?例如:假设它随机生成了一个令牌“123”。那么它有可能生成吗“123”再次随机?@John根据您的网站获得的流量,此令牌生成逻辑可以生成一个重复的令牌,频率高达千万次。在令牌上放置唯一索引并执行
begin;self.token=SecureRandom.hex[0,10]会更安全.upcase;rescue ActiveRecord::RecordNotUnique;重试;结束