美文网首页
百宝箱第一集:自定义Model网址

百宝箱第一集:自定义Model网址

作者: 小耿_da0a | 来源:发表于2017-07-21 13:14 被阅读15次

前提

像这种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_controllerapp/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/

相关文章

网友评论

      本文标题:百宝箱第一集:自定义Model网址

      本文链接:https://www.haomeiwen.com/subject/ldoskxtx.html