前提
像这种resources :events
这样的路由,推荐使用自定义网址。
有三种方案:
方案一. 在modles/events加入:
def to_param
"#{self.id}-#{self.name}"
end
这样就会产生Id和相对于的名称网址了。
方案二:乱数ID
1. rails g migration add_friendly_id_to_events
加入:
def change
add_column :events, :friendly_id, :string
add_index :events, :friendly_id, :unique => true
Event find each do |e|
e.update( :friendly_id => SecureRandom.uuid)
end
end
rake db:migrate
2.在app/controllers/events_controller
和app/controllers/admin/events_controller
,把show,edit,update,destroy的find都改为:find_by_friendly_id!
3. 修改event.rb
+ before_validation :generate_friendly_id, :on => :create
def to_param
- "#{self.id}-#{self.name}"
+ self.friendly_id
end
+ protected
+ def generate_friendly_id
+ self.friendly_id ||= SecureRandom.uuid
+ end
end
4.解说
add_index :events, :friendly_id, unique => true
中unique的作用是限制friendly_id属性的值是唯一的。
before_validaton :generate_friendly_id, :on => :create
on选项是限制为create action的。在create action的验证前先调用自定义的方法,这里是个新的event赋予乱数id,其它的不是很懂。
方案三:用户自定义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>
编辑app/controllers/admin/events_controller.rb
def event_params
params.require(:event).permit(:name, :description, :friendly_id)
end
加上一些资料验证:
app/models/event.rb
- validates_presence_of :name
+ validates_presence_or :name, :friendly_id
+
+validates_uniqueness_of :friendly_id
+validates_format_of :friendly_id, :with => \/A[a-z0-9\-]+\z/