Step 1.网址上除了数字ID,可以再加上文字
修改app/models/job.rb
,加上一个to_param
方法
def to_param
"#{self.id}-#{self.title}" ##可更换title,输出相应的文字
end
这样就好了,出来的网址就会变成 /jobs/123-名称
to_param
方法其实是一个 Rails 默认就有的方法
Step 2.如何生成乱数ID
不要用数据库的递增数字ID,而是用一个乱数产生的 ID
在终端执行 rails g migration add_friendly_id_to_jobs
新增另一个字段到jobs
编辑201904XXXXXXXX_add_friendly_id_to_jobs.rb
def change
+ add_column :jobs, :friendly_id, :string
+ add_index :jobs, :friendly_id, :unique => true
+ Job.find_each do |e|
+ e.update( :friendly_id => SecureRandom.uuid )
+ end
end
在终端运行 rake db:migrate
编辑app/controllers/jobs_controller
改用 friendly_id 这个字段来找 job
def show
- @job = Job.find(params[:id])
+ @job = Job.find_by_friendly_id!(params[:id])
end
def edit
- @job = Job.find(params[:id])
+ @job = Job.find_by_friendly_id!(params[:id])
def update
- @job = Job.find(params[:id])
+ @job = Job.find_by_friendly_id!(params[:id])
def destroy
- @job = Job.find(params[:id])
+ @job = Job.find_by_friendly_id!(params[:id])
编辑 app/models/job.rb
修改 to_param 改成用 friendly_id,並在新增的时候自动产生乱数的 friendly_id。
before_validation :generate_friendly_id, :on => :create
def to_param
- "#{self.id}-#{self.title}"
+ self.friendly_id
end
+ protected
+ def generate_friendly_id
+ self.friendly_id ||= SecureRandom.uuid
+ end
Step 3.用户可以自定义 ID
基于方案二,我们只要让管理员可以编辑 friendly_id 字段即可:
编辑 app/views/admin/events/_form.html.erb
<div class="form-group">
+ <%= f.label :friendly_id %>
+ <%= f.text_field :friendly_id, required: true, class: "form-control" %>
+ <p class="help-block">限小写英数字及横线,将作为网址的一部分</p>
+</div>
编辑 app/controllers/admin/events_controller.rb
def job_params
- params.require(:event).permit(:job, :description)
+ params.require(:event).permit(:job, :description, :friendly_id)
end
由于这个字段输入的资料,会出现在网址上,所以最好加上一些资料验证:
编辑 app/models/event.rb
validates_presence_of :name
+ validates_presence_of :title, :friendly_id
+
+ validates_uniqueness_of :friendly_id
+ validates_format_of :friendly_id, :with => /\A[a-z0-9\-]+\z/
这里不但要检查必填,还检查了必须唯一,而且格式只限小写英数字及横线。