Ruby on rails 如何在模型中设置属性?

Ruby on rails 如何在模型中设置属性?,ruby-on-rails,ruby,ruby-on-rails-4,rails-activerecord,Ruby On Rails,Ruby,Ruby On Rails 4,Rails Activerecord,我想从模型中自动生成一个散列值 用户创建一份简历,然后他们可以通过单击共享按钮来共享简历,该按钮会自动生成一个唯一的随机哈希字符串url,该url绑定到特定的简历视图 class ResumesController < ApplicationController def share @resume = Resume.find(params[:id]) @share = Share.new @share.resume_id = @resume.id

我想从模型中自动生成一个散列值

用户创建一份简历,然后他们可以通过单击共享按钮来共享简历,该按钮会自动生成一个唯一的随机哈希字符串url,该url绑定到特定的简历视图

class ResumesController < ApplicationController

  def share
    @resume = Resume.find(params[:id])

    @share = Share.new
    @share.resume_id = @resume.id 

    @share.save

    redirect_to action: 'index'
  end

end

我的问题是,如何创建一个唯一的哈希并将其存储在hash_url列中?另外,我假设在保存之前,它必须检查共享表,以确保它没有保存已经存在的哈希

您可以在保存对象之前生成并存储哈希。向您的模型中添加类似的内容:

# share.rb
before_validation :generate_hash

private
def generate_hash
  self.hash_url = Resume.find(resume_id).content.hash
end
hash方法是Ruby提供的一种方法:它根据字符串的长度和内容返回一个hash

我猜您希望将用户发送到以下位置:

domain.com/resumes/your_secret_hash_url #-> kind of like a uuid?
我这样做的方法是使用带有SecureRandom的before_create回调。虽然这不会为您提供唯一的值,但您可以对照以下表格进行检查:

#app/models/resume.rb
Class Resume < ActiveRecord::Base
   before_create :set_hash

   private

   def set_hash
       self.hash_url = loop do
         random_token = SecureRandom.urlsafe_base64(nil, false)
         break random_token unless Resume.exists?(token: random_token)
       end
   end
end
参考:


这将使您能够在创建时设置hash_url,并使其具有唯一性

some!但是简历中没有我需要查找和散列的东西。我只需要生成一个随机散列,也许我可以限制它的字符数,并将其指定为self.hash_url。所以不确定它是否需要调用另一个生成散列的函数?我知道你需要一个散列,这取决于我们简历的内容,所以当两份简历有相同的内容时,它们也有相同的散列。如果您只需要一个唯一的值,请使用self.hash_url=SecureRandom.hex或SecureRandom模块中的其他方法:
#app/models/resume.rb
Class Resume < ActiveRecord::Base
   before_create :set_hash

   private

   def set_hash
       self.hash_url = loop do
         random_token = SecureRandom.urlsafe_base64(nil, false)
         break random_token unless Resume.exists?(token: random_token)
       end
   end
end