前提
像這種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/